LOJ10068秘密的牛奶运输

题目描述

Farmer John 要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。 运输的总距离越小,运输的成本也就越低。低成本的运输是 Farmer John 所希望的。不过,他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。

输入格式

第一行是两个整数 N,M,表示顶点数和边数;

接下来 M 行每行 3 个整数,x,y,z,表示一条路的两端x,y 和距离z。

输出格式

仅一行,输出第二小方案。

样例

样例输入

4 4
1 2 100
2 4 200
2 3 250
3 4 100

样例输出

450

数据范围与提示

对于全部数据,1≤N≤500,1≤M≤10^4,1≤z≤10^9,数据可能有重边。

__________________________________________________________________

严格次小生成树。

ff[i][j]表示:i点向上跳2^j步经过的最大值

fs[i][j]表示:i点向上跳2^j步经过的次大值

这个样枚举每一条边,替换边的两点(u,v)之间在树上的链的最大值或次大值(如果边的权和最大值的权相等),求得的就可能是次小生成树。在所有可能的次小生成树中求最小的就是结果。

__________________________________________________________________

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn=505;
  4 const int maxm=1e4+10;
  5 int n,m;
  6 struct edge
  7 {
  8     int u,v,w,nxt;
  9 }e[maxn<<1],ee[maxm];
 10 int head[maxn],js,jss;
 11 long long ans=1000000000000000ll,tt;
 12 void addage(int u,int v,int w)
 13 {
 14     e[++js].u=u;e[js].v=v;e[js].w=w;
 15     e[js].nxt=head[u];head[u]=js;
 16 }
 17 void addagef(int u,int v,int w)
 18 {
 19     ee[jss].u=u;ee[jss].v=v;ee[jss++].w=w;
 20 }
 21 bool cmp(edge a,edge b)
 22 {
 23     return a.w<b.w;
 24 }
 25 int fa[maxn];
 26 int find(int x)
 27 {
 28     return fa[x]==x?x:fa[x]=find(fa[x]);
 29 }
 30 int f[maxn][10],ff[maxn][10],fs[maxn][10],dep[maxn];
 31 void dfs(int u,int fat)
 32 {
 33     dep[u]=dep[fat]+1;
 34     for(int i=head[u];i;i=e[i].nxt)
 35     {
 36         int v=e[i].v;
 37         if(v!=fat)
 38         {
 39             f[v][0]=u;
 40             ff[v][0]=e[i].w;
 41             for(int i=1;i<10;++i)
 42             {
 43                 f[v][i]=f[f[v][i-1]][i-1];
 44                 int a=ff[v][i-1],b=ff[f[v][i-1]][i-1],c=fs[v][i-1],d=fs[f[v][i-1]][i-1];
 45                 ff[v][i]=max(a,b);
 46                 if(a==b)fs[v][i]=max(c,d);
 47                 else if(a>b)fs[v][i]=max(b,c);
 48                 else fs[v][i]=max(a,d);
 49             }
 50             dfs(v,u);
 51         }
 52     }
 53 }
 54 int lg[maxn];
 55 int lca(int u,int v)
 56 {
 57     lg[0]=-1;
 58     for(int i=1;i<=n;++i)lg[i]=lg[i>>1]+1;
 59     if(dep[u]<dep[v])swap(u,v);
 60     while(dep[u]>dep[v])u=f[u][lg[dep[u]-dep[v]]];
 61     if(u==v)return u;
 62     for(int i=lg[dep[u]];i>=0;--i)
 63         if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
 64     return f[u][0];
 65 }
 66 void work(int u,int l,int &mx,int &se)
 67 {
 68     while(dep[u]>dep[l])
 69     {
 70         int a=ff[u][lg[dep[u]-dep[l]]],c=fs[u][lg[dep[u]-dep[l]]];
 71         u=f[u][lg[dep[u]-dep[l]]];
 72         int b=mx,d=se;
 73         mx=max(a,b);
 74         if(a==b)se=max(c,d);
 75         else if(a>b)se=max(b,c);
 76         else se=max(a,d);
 77     }
 78 }
 79 int main()
 80 {
 81     scanf("%d%d",&n,&m);
 82     for(int u,v,w,i=0;i<m;++i)
 83     {
 84         scanf("%d%d%d",&u,&v,&w);
 85         addagef(u,v,w);
 86     }
 87     sort(ee,ee+m,cmp);
 88     for(int i=1;i<=n;++i)fa[i]=i;
 89     for(int i=0;i<m;++i)
 90     {
 91         int a=find(ee[i].u),b=find(ee[i].v);
 92         if(a!=b)
 93         {
 94             fa[a]=b;
 95             addage(ee[i].u,ee[i].v,ee[i].w);
 96             addage(ee[i].v,ee[i].u,ee[i].w);
 97             ee[i].nxt=1;
 98             tt+=ee[i].w;
 99             if(js==2*n-2)break;
100         }
101     }
102     dfs(1,0);
103     for(int u,v,w,l,i=0;i<m;++i)
104     if(ee[i].nxt==0)
105     {
106         u=ee[i].u;v=ee[i].v;w=ee[i].w;
107         l=lca(u,v);
108         int a=0,b=0,c=0,d=0,mx,se;
109         work(u,l,a,c);
110         work(v,l,b,d);
111         mx=max(a,b);
112         if(a==b)se=max(c,d);
113         else if(a>b)se=max(b,c);
114         else se=max(a,d);
115         if(mx!=w) ans=min(ans,tt+w-mx);
116         else if(w==mx && se!=0)ans=min(ans,tt+w-se);
117     }
118     cout<<ans;
119     return 0;
120 }

View Code

转载于:https://www.cnblogs.com/gryzy/p/10506178.html

LOJ10068 秘密的牛奶运输相关推荐

  1. 秘密的牛奶运输 题解

    秘密的牛奶运输 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低. 低成本的运输是农夫约翰所 ...

  2. acwing1148——秘密的牛奶运输(求次小生成树)

    https://www.acwing.com/problem/content/description/1150/ 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由 ...

  3. 【次小生成树】4.秘密的牛奶运输

    题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低. Farmer J ...

  4. 每日算法题(Day4)----秘密的牛奶运输

    题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低.Farmer Jo ...

  5. 【图论专题】最小生成树的扩展应用

    整理的算法模板合集: ACM模板 最小生成树的扩展应用 能用kruskal打死不用prim kruskal是要把所有的边都遍历一遍 图论中的超级源点就比较常用,要时刻想到它 题目列表: 题目 算法 A ...

  6. 提高篇 第三部分 图论 第1章 最小生成树

    最小生成树 最小生成树_百度百科 几分钟搞明白生成树和最小生成树的定义 几分钟搞明白生成树和最小生成树的定义_听老罗娓娓道来-CSDN博客_生成树的定义 最小生成树---Prim算法和Kruskal算 ...

  7. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  8. 《信息学奥赛一本通》提高版题单

    第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...

  9. AcWing-算法提高课【合集】

    算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...

  10. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树

    Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...

最新文章

  1. Spring Boot中如何扩展XML请求和响应的支持
  2. SAP UI5 应用开发教程之八 - 多语言的支持
  3. wxpython如何分开界面和运行代码_如何调试wxPython Demon源代码及几个细节
  4. python 标签字体大小_这文档动画,怎么用 Python 实现的?
  5. vue 中 v-bind 合并行为
  6. servlet3异步 例子_异步Servlet示例
  7. 新手必备的矢量网络分析仪使用教程
  8. 计算机投影仪的作用是什么,投影电脑
  9. drop_caches释放哪些内存
  10. Jdon DDD分析法
  11. 装系统时遇到的一些坑
  12. Windows 11系统设置文件夹默认显示方式为“大图标”的方法
  13. vue-生成二维码【生成、点击输入框内叉号移除生成的二维码、输入框聚焦】
  14. 趣店纽交所上市,市值近百亿美金;百度国际事业部将独立分拆;摩拜单车进入韩国水原市丨价值早报
  15. 谷歌三大核心技术(三)Google BigTable中文版
  16. Gate使用手册(四)数据输出
  17. SAP License:反记账功能的应用
  18. mysql 二级什么意思_MySQL二级等级考试归纳——概念篇
  19. 问题七:vue+ts The left-hand side of an assignment expression may not be an optional property?
  20. 你都是会点啥技术(五)--- 数据库

热门文章

  1. 大数据趋势下,服务风暴必将来临
  2. 女研究生做“思维导图”与男友吵架!网友:吵架届的“内卷之王”....
  3. Linux系统无法在spyder5中输入中文的解决办法
  4. ipv4的地址位数_ipv4
  5. C:警告:assignment to ‘char’ from ‘int *‘ makes integer from pointer without a cast -Wint-conversion
  6. 中国首个“微信身份证”是怎么做到人脸识别误判率百万分之一的?
  7. nmds与mds的区别_帮研网—科研共享平台——PCA、PCoA和NMDS有什么区别?
  8. 三维激光扫描后处理软件_青出于蓝 尽锋芒——非白三维发布蓝激光手持三维扫描仪...
  9. 机器学习——数学建模应用
  10. centos7.4上tecplot 奔溃 用python时