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 }
LOJ10068 秘密的牛奶运输的更多相关文章
- 「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树
题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低.低成本的运输是 F ...
- 2018.09.15 秘密的牛奶管道SECRET(次小生成树)
描述 约翰叔叔希望能够廉价连接他的供水系统,但是他不希望他的竞争对手知道他选择的路线.一般这样的问题需要选择最便宜的方式,所以他决定避免这种情况而采用第二便宜的方式. 现在有W(3 <= W & ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- CPU阿甘:函数调用的秘密
个人感言:真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解.感谢"码农翻身" 公共号,感谢你们的成果, ...
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- 网站的SEO以及它和站长工具的之间秘密
博客迁移没有注意 URL 地址的变化,导致百度和 google 这两只爬虫引擎短时间内找不到路.近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具,说下感受. 百度的站长工具 ...
随机推荐
- Centos7 搭建openldap完整详细教程(真实可用)
最近,由于公司需求,需要搭建openldap来统一用户名和密码,目前市面上几乎所有的工具都支持ldap协议,具体ldap的介绍这里就不详细说明了,这里主要记录一下如果部署openldap来实现Ldap ...
- 远程桌面连接(出现身份验证错误。要求的函数不支持)这可能由于CredSSP加密Oracle修正。
家庭版解决方案 在进行远程桌面时会遇到这种情况.对于Windows 10家庭版用户,是不支持组策略功能的.本文根据官方文档采用修改注册表的方式达到相同的目的. 1.打开注册表 win + R 键 ...
- 单细胞分析实录(4): doublet检测
最近Cell Systems杂志发表了一篇针对现有几种检测单细胞测序doublet的工具的评估文章,系统比较了常见的例如Scrublet.DoubletFinder等工具在检测准确性.计算效率等方面的 ...
- 详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)
redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...
- java final思考
final关键之主要用在三个方向: 数据 对于基本类型,final使数据恒定不变:而对于对象引用,final使引用恒定不变即无法再重新new另一个对象给他: 空白final JAVA允许定义一个空白f ...
- hashmap简单实现
p.p1 { margin: 0; font: 11px Monaco } p.p2 { margin: 0; font: 11px Monaco; min-height: 15px } p.p3 { ...
- Python强大的日志模块logging
前言 日志是对于软件执行所发生的事件的一种追踪记录方式.日常使用过程中对代码执行的错误和问题会进行查看日志来分析定位问题所在.平常编写代码以及调试也经常用到.通常的新手的做法是直接print打印,但是 ...
- mysql5.7.20压缩版安装
1.官网下载.zip格式的MySQL Server的压缩包,选择x86或x64版,并解压. 2. 创建 data文件夹 及 my.ini文件,并编辑 [mysqld] # 设置为自己MYSQL的安装目 ...
- 笔记本使用网线连接可以进行ftp下载,但是通过wifi连接只能登陆不能下载的问题。
环境: (1)服务器为阿里云服务器,有公网ip,有内网ip,公网和内网已经做了相关端口的映射,ftp服务器为FileZilla,ftp服务器被动模式已开启,防火墙已关闭 (2)ftp客户端为java写 ...
- GitHub上的开源复刻:暗黑破坏神2
现在的00后少年可能已经不太了解<暗黑破坏神2>这款由暴雪打造的经典游戏. 该游戏上市的时候,国内个人家用电脑还没有那么普及,网络游戏也没有那么风靡,现在的孩子可能无法想象,那时候网吧里的 ...