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的站长工具,说下感受. 百度的站长工具 ...
随机推荐
- 关于Maven项目pom.xml文件不报错却有红叉的问题
原因:spring-boot,升级到2.1.5版本,而maven-jar-plugin.version插件默认版本不兼容所以报错,但不影响运行 解决:在<properties></p ...
- Elastisearch在kibana下批量处理(mget和bulk)
一.批量查询 有点:能够大大减少网络的请求次数,减少网络开销 1.自定义设置index.type以及document id,进行查询 GET /_mget { "docs":[ { ...
- Docker部署&MySQL部署
Docker部署 本文采用的是阿里云的centos7 # 更新yum yum update # 安装docker yum install docker # 启动docker systemctl sta ...
- 手把手教你搭建SSH框架(Eclipse版)
原文来自公众号[C you again],若需下载完整源码,请在公众号后台回复"ssh". 本期文章详细讲解了SSH(Spring+SpringMVC+Hibernate)框架的搭 ...
- Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT SDK 配置详解
系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...
- Xamarin.Forms 5.0 来了
Xamarin.Forms 5.0 已经正式发布,并带来其新功能,具体看官方博客https://devblogs.microsoft.com/xamarin/xamarin-forms-5-0-is- ...
- maven 报的一堆错
今天初学maven,刚开始下载的是Apache-maven-3.6.2然后配置运行一个servlet,但是在pom.xml中写jar包坐标时一直报错显示红色,本地仓库和官网上的中央仓库都试过了就是依赖 ...
- k8s之ServiceAccount
导读 上一篇说了k8s的RBAC授权模式,今天就来简单看一下其中涉及到的ServiceAccount. 简介 k8s创建两套独立的账号系统,原因如下: (1)User账号给用户用,Service Ac ...
- 【Java】面向对象 - 封装
继承 封装 多态 重新搞一波 复习巩固 简单记录 慕课网 imooc Java 零基础入门-Java面向对象-Java封装 封装 封装是什么? 将类的某些信息隐藏在类内部,不允许外部程序直接访问 通过 ...
- 【Linux】使用grep快速比较两个文件不同
两个文件的比较,会有同学说使用diff,和vimdiff就可以快速比较,为什么还要使用grep呢? 有些时候,diff和vimdiff的时候环境不符合,这样的情况,就可以使用grep来解决这个问题. ...