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 秘密的牛奶运输的更多相关文章

  1. 「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树

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

  2. 2018.09.15 秘密的牛奶管道SECRET(次小生成树)

    描述 约翰叔叔希望能够廉价连接他的供水系统,但是他不希望他的竞争对手知道他选择的路线.一般这样的问题需要选择最便宜的方式,所以他决定避免这种情况而采用第二便宜的方式. 现在有W(3 <= W & ...

  3. loj题目总览

    --DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...

  4. CSU训练分类

    √√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...

  5. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  6. CPU阿甘:函数调用的秘密

    个人感言:真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解.感谢"码农翻身" 公共号,感谢你们的成果, ...

  7. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  8. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  9. 网站的SEO以及它和站长工具的之间秘密

    博客迁移没有注意 URL 地址的变化,导致百度和 google 这两只爬虫引擎短时间内找不到路.近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具,说下感受. 百度的站长工具 ...

随机推荐

  1. JavaSwing实现的文本比较软件

    先看效果:截图1 截图2: 实现思路: 1.界面UI设计 2.功能点 : a 打开文件进行比较    b 粘贴内容进去比较   c 提示帮助  d 窗口可以任意拖动 3.文本比较算法  java类 : ...

  2. Java学习日报7.18

    /** * *//** * @author 86152 * */ package trangle;import java.util.Scanner; public class Trangle{ pub ...

  3. 详解CSS布局

    CSS页面布局允许我们拾取网页中的元素,并且控制它们相对正常布局流.周边元素.父容器或者主视口/窗口的位置.主要对文档流的改变进行布局.假设你已经掌握了CSS的选择器.属性和值,并且可能对布局有一定了 ...

  4. Ubuntu20.04编译ffmpeg

    1.安装编译所需工具,GCC 2.安装yasm nasm yasm和nasm是两个编译器,编译ffmpeg需要用到 安装命令: sudo aptitude install yasm nasm 3.安装 ...

  5. 搭建 Typecho 个人博客

    搭建 Typecho 个人博客 前言 最近在学习中,感觉有个自己的博客,用来记录学习总结,写写生活点滴是件不错的事. 在网上看到 Typecho 博客和 WordPress博客,顿时被 Typecho ...

  6. DHCP最佳实践(二)

    这是Windows DHCP最佳实践和技巧的最终指南. 如果您有任何最佳做法或技巧,请在下面的评论中发布它们. 在本指南(二)中,我将分享以下DHCP最佳实践和技巧. 从DHCP作用域中排除IP 了解 ...

  7. 【TNS】listener.ora模板;tnsnames.ora模板

    好多人使用监听的时候误操作,将监听弄的不好使了,这次这个模板,不光是针对大家出现的这种问题,也是给我自己留一个记录,方便他人,方便自己. listener.ora模板样例 -------------- ...

  8. 攻防世界—pwn—guess_num

    题目分析 checksec检查文件保护机制 这个结果看的我满是问号??? \n ida分析程序 是一个猜数字的游戏,需要全部输入正确才能得到flag 根据大佬的wp得出一下内容 先使用srand()进 ...

  9. vagrant up报错【io.rb:32:in `encode': "\x95" followed by "\"" on GBK (Encoding::InvalidByteSequenceError)】

    vagrant up报错[io.rb:32:in `encode': "\x95" followed by """ on GBK (Encoding: ...

  10. LSM(Log Structured Merge Trees ) 笔记

    目录 一.大幅度制约存储介质吞吐量的原因 二.传统数据库的实现机制 三.LSM Tree的历史由来 四.提高写吞吐量的思路 4.1 一种方式是数据来后,直接顺序落盘 4.2 另一种方式,是保证落盘的数 ...