LOJ10068 秘密的牛奶运输
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 秘密的牛奶运输相关推荐
- 秘密的牛奶运输 题解
秘密的牛奶运输 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低. 低成本的运输是农夫约翰所 ...
- acwing1148——秘密的牛奶运输(求次小生成树)
https://www.acwing.com/problem/content/description/1150/ 农夫约翰要把他的牛奶运输到各个销售点. 运输过程中,可以先把牛奶运输到一些销售点,再由 ...
- 【次小生成树】4.秘密的牛奶运输
题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低. Farmer J ...
- 每日算法题(Day4)----秘密的牛奶运输
题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低.Farmer Jo ...
- 【图论专题】最小生成树的扩展应用
整理的算法模板合集: ACM模板 最小生成树的扩展应用 能用kruskal打死不用prim kruskal是要把所有的边都遍历一遍 图论中的超级源点就比较常用,要时刻想到它 题目列表: 题目 算法 A ...
- 提高篇 第三部分 图论 第1章 最小生成树
最小生成树 最小生成树_百度百科 几分钟搞明白生成树和最小生成树的定义 几分钟搞明白生成树和最小生成树的定义_听老罗娓娓道来-CSDN博客_生成树的定义 最小生成树---Prim算法和Kruskal算 ...
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- 《信息学奥赛一本通》提高版题单
第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...
- AcWing-算法提高课【合集】
算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...
- `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树
Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...
最新文章
- Spring Boot中如何扩展XML请求和响应的支持
- SAP UI5 应用开发教程之八 - 多语言的支持
- wxpython如何分开界面和运行代码_如何调试wxPython Demon源代码及几个细节
- python 标签字体大小_这文档动画,怎么用 Python 实现的?
- vue 中 v-bind 合并行为
- servlet3异步 例子_异步Servlet示例
- 新手必备的矢量网络分析仪使用教程
- 计算机投影仪的作用是什么,投影电脑
- drop_caches释放哪些内存
- Jdon DDD分析法
- 装系统时遇到的一些坑
- Windows 11系统设置文件夹默认显示方式为“大图标”的方法
- vue-生成二维码【生成、点击输入框内叉号移除生成的二维码、输入框聚焦】
- 趣店纽交所上市,市值近百亿美金;百度国际事业部将独立分拆;摩拜单车进入韩国水原市丨价值早报
- 谷歌三大核心技术(三)Google BigTable中文版
- Gate使用手册(四)数据输出
- SAP License:反记账功能的应用
- mysql 二级什么意思_MySQL二级等级考试归纳——概念篇
- 问题七:vue+ts The left-hand side of an assignment expression may not be an optional property?
- 你都是会点啥技术(五)--- 数据库
热门文章
- 大数据趋势下,服务风暴必将来临
- 女研究生做“思维导图”与男友吵架!网友:吵架届的“内卷之王”....
- Linux系统无法在spyder5中输入中文的解决办法
- ipv4的地址位数_ipv4
- C:警告:assignment to ‘char’ from ‘int *‘ makes integer from pointer without a cast -Wint-conversion
- 中国首个“微信身份证”是怎么做到人脸识别误判率百万分之一的?
- nmds与mds的区别_帮研网—科研共享平台——PCA、PCoA和NMDS有什么区别?
- 三维激光扫描后处理软件_青出于蓝 尽锋芒——非白三维发布蓝激光手持三维扫描仪...
- 机器学习——数学建模应用
- centos7.4上tecplot 奔溃 用python时