题目描述 Description

c国边防军在边境某处的阵地是由n个地堡组成的。工兵连受命来到阵地要进行两期施工。

第一期的任务是挖掘暗道让所有地堡互联互通。现已勘测设计了m条互不相交的暗道挖掘方案,如果这m条暗道都实施挖掘,肯定能达到互联互通的目的。事实上,适当选择其中n-1个方案挖掘,就能实现互联互通,即从每个地堡出发都能到达其他任何一个地堡(允许经过别的地堡)。

连长精心谋算,在m个设计规划中选取了挖掘总距离最短且能保证互联互通的若干个暗道规划实施了挖掘,完成了第一期的施工任务后又接受了第二期的施工任务,要求选择一个地堡进行扩建改造,使其能向每个地堡提供弹药。为了让弹药供应更及时、更快捷,从改扩建的地堡到最远地堡的距离(称为最远输送距离)应当尽量小。

你的任务是先求出第一期施工挖掘的总距离,再求改扩建地堡最远输送距离的最小值。

输入描述 Input Description

其中第一行是n和m,m>=n
下面的m行每行3个数xi、yi、zi,表示xi到yi的距离是zi
zi<1000000且m个距离互不相等

输出描述 Output Description

共包含两行,每行一个整数,
第一行是第一期的挖掘总距离,第二行是最远输送距离的最小值。

样例输入 Sample Input

4 5
1 2 1
2 3 2
3 4 3
4 1 4
3 1 5

样例输出 Sample Output

6
3

数据范围及提示 Data Size & Hint

【样例说明】
第一期挖掘1到2、2到3和3到4的3条暗道,第二期选择3号地堡进行改扩建,最远输送距离是3
【数据规模】
60%的数据 n<10且m<20
80%的数据 n<1000且m<2000
100%的数据 n<100000且m<200000


求最小生成树上的重心。

其实写这个题的题解并没有什么必要,我只是想说,带权树求重心不可以一遍dfs就完事,因为带权了…

【poj1655】Balancing Act 求树的重心
这是我上一篇题解,其中讲了无权树如何简单的求重心。带权树中,对于一个点,因为有出入边的权值的影响,并不能很好的求解。当然样例是不会告诉你这些的233

所以我打的朴素bfs找直径。代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int size=1000010;
const int INF=233333333;
typedef long long LL;
int fa[size];
int find(int x)
{return x==fa[x]?x:fa[x]=find(fa[x]);
}int head[size],nxt[size],tot=0;struct edge{int t;LL d;
}l[size];void build(int f,int t,LL d)
{l[++tot].t=t;l[tot].d=d;nxt[tot]=head[f];head[f]=tot;
}queue<int> q;
LL ans1=0;
bool vis[size];
LL dist[size];
int pre[size];
void bfs(int u)
{memset(pre,0,sizeof(pre));memset(dist,0,sizeof(dist));memset(vis,0,sizeof(vis));q.push(u);vis[u]=1;while(q.size()){int f=q.front(); q.pop();for(int i=head[f];i;i=nxt[i]){int v=l[i].t;if(vis[v]) continue;vis[v]=1;dist[v]=dist[f]+l[i].d;pre[v]=f;q.push(v);  }}
}int n,m;
int gets()
{LL maxn=0;int s;for(int i=1;i<=n;i++){if(dist[i]>maxn) s=i,maxn=dist[i];}return s;
}int path[size],len=0;
void dfs(int u,int s)
{if(u==s){path[++len]=s;return ;}dfs(pre[u],s);path[++len]=u;
}struct haha{int f,t;LL d;
}ll[size];
bool cmp(haha a,haha b)
{return a.d<b.d;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){scanf("%d%d%lld",&ll[i].f,&ll[i].t,&ll[i].d); }sort(ll+1,ll+1+m,cmp);LL ans1=0;for(int i=1;i<=m;i++){int x=find(ll[i].f);int y=find(ll[i].t);if(x!=y){fa[x]=y;ans1+=ll[i].d;build(ll[i].f,ll[i].t,ll[i].d);build(ll[i].t,ll[i].f,ll[i].d);}}bfs(1);int s=gets();bfs(s);int e=gets();dfs(e,s);LL ans2=INF;
//  for(int i=1;i<=n;i++) cout<<dist[i]<<endl;for(int i=1;i<=len;i++) {ans2=min(ans2,max(dist[path[i]],dist[e]-dist[path[i]]));}printf("%lld\n%lld",ans1,ans2);return 0;
}

先附个样例:
输入:

8 15
6 3 46
8 8 17
3 3 28
5 7 35
5 7 33
3 2 14
2 6 28
2 2 25
1 2 7
7 1 44
1 5 39
6 7 20
6 7 26
7 6 46
6 5 5

输出:

74
42

这是我打dfsWA了的代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL size=1000010;
const LL INF=233333333;
LL fa[size];
LL find(LL x)
{return x==fa[x]?x:fa[x]=find(fa[x]);
}LL head[size],nxt[size],tot=0;struct edge{LL t;LL d;
}l[size];void build(LL f,LL t,LL d)
{l[++tot].t=t;l[tot].d=d;nxt[tot]=head[f];head[f]=tot;
}bool vis[size];
LL dist[size];LL ans1=0,ans2=INF;
void dfs(LL u)
{dist[u]=0;vis[u]=1;LL ans=0;for(LL i=head[u];i;i=nxt[i]){LL v=l[i].t;if(vis[v]) continue;dfs(v);dist[u]+=dist[v]+l[i].d;ans=max(ans,dist[v]+l[i].d);}ans=max(ans,ans1-dist[u]);if(ans2>ans) ans2=ans;cout<<u<</*" "<<ans1-dist[u]<<*/" "<<ans<<endl;
}struct haha{LL f,t;LL d;
}ll[size];
bool cmp(haha a,haha b)
{return a.d<b.d;
}
int main()
{freopen("1700.in","r",stdin);
//  freopen("1700.out","w",stdout); LL n,m;scanf("%lld%lld",&n,&m);for(LL i=1;i<=n;i++) fa[i]=i;for(LL i=1;i<=m;i++){scanf("%lld%lld%lld",&ll[i].f,&ll[i].t,&ll[i].d); }sort(ll+1,ll+1+m,cmp);for(LL i=1;i<=m;i++){LL x=find(ll[i].f);LL y=find(ll[i].t);if(x!=y){fa[x]=y;ans1+=ll[i].d;build(ll[i].f,ll[i].t,ll[i].d);build(ll[i].t,ll[i].f,ll[i].d);}}dfs(1);for(LL i=1;i<=n;i++) cout<<dist[i]<<" ";puts("");   printf("%lld\n%lld",ans1,ans2);return 0;
}

【codevs1700】施工方案第二季 MST+树的重心相关推荐

  1. codevs1700 施工方案第二季

    题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案, ...

  2. codevs 1700 施工方案第二季

    1700 施工方案第二季 2012年市队选拔赛北京  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description c国边防 ...

  3. 54.施工方案第二季(最小生成树)

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地 ...

  4. 1700施工方案第二季{转nbsp;仕林}

    总的来说,这是一道考图论知识的题,可以搜到很多关于树的直径的东西,以及一些证明,这是一道好题! program shigong; type arr=array[1..200000]of longint ...

  5. 《奋斗》第二季 陆涛和米莱结婚啦……

    <奋斗>第二季剧情人物命运介绍. 陆涛刚到法国接到了华子向南打来的电话告知陆涛的父亲不幸去世了.陆涛认为是徐志森去世了.结果告知是陆亚迅去世了.陆涛极度伤心,决定回国参加丧礼.夏琳说等他事 ...

  6. 百度AI实战营第二季:AI技术商业落地指南

    4月 20日,百度 AI开发者实战营第二季启动,再次召集全国各地技术管理者,在北京"整装待发",并将陆续登陆成都.杭州.深圳.在新一季的实战营中,百度 AI将与开发者.合作伙伴一起 ...

  7. 从全职高手开始的系统_动画全职高手第二季热血回归,腾讯视频的国漫IP全链路开发之道...

    这个国庆档,国产动画在内容市场上的存在感比想象中更加有分量.电影市场上,动画IP电影<姜子牙>完成票房领跑,掀起观影热潮:动画番剧市场上,头部IP动画<全职高手>第二季时隔三年 ...

  8. 场景联创 施耐德电气“绿色智能制造创赢计划”第二季收官

    中国上海,2021年12月21日--今日,由工业和信息化部国际经济技术合作中心(工信部国合中心)与施耐德电气主办的"绿色智能制造创赢计划"第二季总决赛在上海举办.经过半年多的加速营 ...

  9. 打造最美HTML5 3D机房 —— 第二季重磅回归

    前情提要 前阵子写了一篇打造最美html5 3d机房,介绍了如何用html5在网页上创建无插件的精美3d机房场景.这两个月以来,陆续收到很多朋友的鼓(膝)励(盖),受宠若惊之余,对索要源代码的朋友都已 ...

最新文章

  1. SSL压力测试工具THC-SSL-DOS
  2. js控制公共模板中,不同页面中的导航选中效果-判断当前的url
  3. 深入浅出Android BufferQueue
  4. 探索比特币源码1-运行 Bitcoin Core Node
  5. python里自带的绘画库是_Python绘图Turtle库详解
  6. Webpack实战(四):教教你如何轻松搞定-预处理器(loader)
  7. Unity2D开发小细节
  8. 如何在新系统下重玩老游戏
  9. Excel生成柱状图报表示例
  10. 记牌器内存扫描法原理(转)
  11. html调用打印机,[Javascript]网页调用打印机
  12. 青岛阳光计算机学校,青岛恒星科技学院
  13. pythoneducoder苹果梨子煮水的功效_苹果梨子煮水的功效是什么呢
  14. Javascript带按钮的轮播广告
  15. 目前缺少用于语义分割的 3D LiDAR 数据吗?关于三维点云数据集和方法的调查
  16. win10自启动方法
  17. Fibonacci数列通项公式推导
  18. 什么鬼,Kubelet 重启之后容器也跟着重启了?
  19. 程序员如何优雅地使用 macOS?
  20. Mellanox SX6036 40G/56G IB/以太网交换机基础配置以及开启web管理

热门文章

  1. Python计算圆的周长面积和球的表面积和体积
  2. 批处理系统,分时系统,实时系统
  3. nodejs/electron 解压加密zip 压缩包方法
  4. animate inater插件_AE中学习logo标志设置动画MG教程Animate a Logo in Adobe After Effects CC with Motion Graphics...
  5. C# 如何调用以管理员身份运行的cmd命令提示符
  6. 篮球比赛淘汰赛c语言程序代码,源程序C代码:篮球比赛应用系统(3)
  7. 搞清楚字符编码06-万国码[2]
  8. 教妹学 Java:难以驾驭的多线程
  9. idea导入springboot项目
  10. 小程序 下拉刷新数据加载完毕时停止loading效果