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的站长工具,说下感受. 百度的站长工具 ...
随机推荐
- pyspark使用-dataframe操作
一.读取csv文件 1.用pandas读取 import pandas as pd from pyspark.sql import SparkSession spark=SparkSession.bu ...
- Mac电脑 Android Studio连接小米手机
1.设置>关于本机>点击5下MIUI版本>激活开发者模式 2.设置>更多设置>开发者选项>开启开发者选项>开启USB调试>开启USB安装>开启显示 ...
- ReentrantLock显示锁
public class AttemptLocking { /* * public AttemptLocking() { * * System.out.println("构造器初始化...& ...
- LVS之3---健康检查
LVS实现健康性检查功能 LVS高可用性 解决方案: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用 keepalived heartbeat/corosync ldirector ...
- oracle 客户端与服务器端字符集原理(转自totozlj)
1.环境假设: 名词解释:应用程序页面即用户在浏览器中看到的页面,一般程序员在写页面的时候都会在页面中设置编码,这个编码也即是数据在浏览器到web服务器间传输的编码,如果不设置则默认iso-8859的 ...
- MySQL更新勿用and
项目实战 一次错误的更新 更新前的数据 执行更新语句 然后我们查看下更新后的数据,发现居然数据为空? 使用主键id的方式查询这条数据,发现需要更新的手机号码居然变为了0 当我们把更新语句中的and ...
- 使用CSS的clip-path实现图片剪切效果
最近有个业务需求:校对图片文本信息,如下图所示,当鼠标点击文本中某一行的时候,文本上会显示对应行图片同时左侧会显示对应位置的画框. clip-path 今天要说的主题是:如何剪切原图中的部分图片?(前 ...
- 基于Docker搭建Hadoop+Hive
为配合生产hadoop使用,在本地搭建测试环境,使用docker环境实现(主要是省事~),拉取阿里云已有hadoop镜像基础上,安装hive组件,参考下面两个专栏文章: 克里斯:基于 Docker 构 ...
- Log4j配置按照文件大小和日期分割日志文件
目录 Log4j 下载地址 文件大小分割日志文件 以日期分割每天产生一个日志文件 自定义信息输出到日志文件 Log4j 下载地址 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控 ...
- 【VNC】vnc安装oracle的时候不显示图形化界面
背景: 在虚拟机搭建了一个环境,准备安装oracle.但是环境都配置完成后,执行./runInstaller的时候,没有界面显示,只显示下面的界面 多次尝试后,发现,还是这样,期初是因为没有配置DIS ...