codevs 1700 施工方案第二季
c国边防军在边境某处的阵地是由n个地堡组成的。工兵连受命来到阵地要进行两期施工。
第一期的任务是挖掘暗道让所有地堡互联互通。现已勘测设计了m条互不相交的暗道挖掘方案,如果这m条暗道都实施挖掘,肯定能达到互联互通的目的。事实上,适当选择其中n-1个方案挖掘,就能实现互联互通,即从每个地堡出发都能到达其他任何一个地堡(允许经过别的地堡)。
连长精心谋算,在m个设计规划中选取了挖掘总距离最短且能保证互联互通的若干个暗道规划实施了挖掘,完成了第一期的施工任务后又接受了第二期的施工任务,要求选择一个地堡进行扩建改造,使其能向每个地堡提供弹药。为了让弹药供应更及时、更快捷,从改扩建的地堡到最远地堡的距离(称为最远输送距离)应当尽量小。
你的任务是先求出第一期施工挖掘的总距离,再求改扩建地堡最远输送距离的最小值。
其中第一行是n和m,m>=n
下面的m行每行3个数xi、yi、zi,表示xi到yi的距离是zi
zi<1000000且m个距离互不相等
共包含两行,每行一个整数,
第一行是第一期的挖掘总距离,第二行是最远输送距离的最小值。
4 5
1 2 1
2 3 2
3 4 3
4 1 4
3 1 5
6
3
【样例说明】
第一期挖掘1到2、2到3和3到4的3条暗道,第二期选择3号地堡进行改扩建,最远输送距离是3
【数据规模】
60%的数据 n<10且m<20
80%的数据 n<1000且m<2000
100%的数据 n<100000且m<200000
分类标签 Tags 点此展开
思路:先跑最小生成树,得出第一个答案。
第二期任务是要求最远距离最小,我们可以很容易的得出以下结论:这个点一定位于这棵树的直径上,并且是这棵树的直径的中点。
找到这个点后,再跑一个spfa或者dfs,找出离这个点最远的点,这个距离就是答案。
错因:别忘了开long long。
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXNCNT 100010
#define MAXEDGE 200010
using namespace std;
long long ans,ans2;
int n,m,tot,src,decc,home;
long long minn=0x7f7f7f7f,mann=0x7f7f7f7f;
long long dis[MAXNCNT],cap[MAXEDGE*];
long long sum1[MAXNCNT],sum2[MAXNCNT];
int fa[MAXNCNT],dad[MAXNCNT],vis[MAXNCNT];
int to[MAXEDGE*],net[MAXEDGE*],head[MAXNCNT];
struct nond{ int u,v;long long w; }v[MAXEDGE];
int abs(int x){ return x>?x:-x; }
int cmp(nond a,nond b){ return a.w<b.w; }
int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); }
void add(int u,int v,long long w){
to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
to[++tot]=u;cap[tot]=w;net[tot]=head[v];head[v]=tot;
}
void spfa(int s){
queue<int>que;
memset(vis,,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
dis[s]=;vis[s]=;que.push(s);
while(!que.empty()){
int now=que.front();
que.pop();vis[now]=;
for(int i=head[now];i;i=net[i])
if(dis[to[i]]>dis[now]+cap[i]){
dis[to[i]]=dis[now]+cap[i];
if(!vis[to[i]]){
vis[to[i]]=;
que.push(to[i]);
}
}
}
}
void dfs(int now){
for(int i=head[now];i;i=net[i])
if(dis[to[i]]==-){
dis[to[i]]=dis[now]+cap[i];
dfs(to[i]);
}
}
void dfs1(int now){
for(int i=head[now];i;i=net[i])
if(dad[now]!=to[i]){
dad[to[i]]=now;
sum1[to[i]]=sum1[now]+cap[i];
dfs1(to[i]);
}
}
void dfs2(int now){
for(int i=head[now];i;i=net[i])
if(dad[now]!=to[i]){
dad[to[i]]=now;
sum2[to[i]]=sum2[now]+cap[i];
dfs2(to[i]);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d%lld",&v[i].u,&v[i].v,&v[i].w);
sort(v+,v++m,cmp);
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=m;i++){
int dx=find(v[i].u);
int dy=find(v[i].v);
if(dx==dy) continue;
fa[dy]=dx;ans+=v[i].w;
add(v[i].u,v[i].v,v[i].w);
}
printf("%lld\n",ans);
memset(dis,-,sizeof(dis));
decc=;dis[decc]=;dfs(decc);
for(int i=;i<=n;i++)
if(dis[i]>dis[decc]) decc=i;
memset(dis,-,sizeof(dis));
dis[decc]=;dfs(decc);src=decc;
for(int i=;i<=n;i++)
if(dis[i]>dis[decc]) decc=i;
dfs1(src);memset(dad,,sizeof(dad));
dfs2(decc);memset(dad,,sizeof(dad));
for(int i=;i<=n;i++){
long long little=abs(sum1[i]-sum2[i]);
if(little<minn){ mann=sum1[i];home=i;minn=little; }
else if(little==minn)
if(sum1[i]<mann){ mann=sum1[i];home=i; }
}
spfa(home);
for(int i=;i<=n;i++)
if(i!=home&&dis[i]>ans2) ans2=dis[i];
cout<<ans2;
}
codevs 1700 施工方案第二季的更多相关文章
- codevs——1700 施工方案第二季
1700 施工方案第二季 2012年市队选拔赛北京 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description c国边防 ...
- CODEVS——T 1700 施工方案第二季
http://codevs.cn/problem/1700/ 2012年市队选拔赛北京 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 ...
- codevs1700 施工方案第二季
题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案, ...
- COJ262 HDNOIP201206施工方案
HDNOIP201206施工方案 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 c国边防军在边境某处的阵地是由n个地堡组成的. ...
- HDNOIP201206施工方案
HDNOIP201206施工方案 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 c国边防军在边境某处的阵地是由n个地堡组成的. ...
- [转][南京米联ZYNQ深入浅出]第二季更新完毕课程共计16节课
[南京米联]ZYNQ第二季更新完毕课程共计16节课 [第二季ZYNQ] ...
- 【第二季】CH11_ ZYNQ软硬调试高级技巧
[第二季]CH11_ ZYNQ软硬调试高级技巧 软件和硬件的完美结合才是SOC的优势和长处,那么开发ZYNQ就需要掌握软件和硬件开发的调试技巧,这样才能同时分析软件或者硬件的运行情况,找到问题,最终解 ...
- [第二季ZYNQ] [南京米联]ZYNQ第二季更新完毕课程共计16节课
ZYNQ第二季更新完毕课程共计16节课全部免费 [第二季ZYNQ] ...
- 《舌尖上的中国》第二季今日首播了,天猫食品也跟着首发,借力使力[bubuko.com]
天猫旗下的天猫食品与央视CCTV-1栏目<舌尖上的中国>第二季(以下简称“舌尖2”)达成合作,天猫食品成为舌尖2独家合作平台,同步首发每期 节目中的食材和美食菜谱,舌尖2摄制组还将为同步上 ...
随机推荐
- pcntl研究
虽说php用于并发计算有点山寨,但总比没有强把.(有问题请指正) 下面是pcntl多线程的例子.(只能用于cli模式,而且只能用于linux环境) <?php $starttime=microt ...
- JavaScript--确认(confirm 消息对话框)
confirm 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confirm(str); 参数说明: str:在消息对话框中要显示 ...
- 【洛谷2257/BZOJ2820】YY的GCD(数论/莫比乌斯函数)
题目: 洛谷2257 预备知识:莫比乌斯定理(懵逼乌斯定理) \(\mu*1=\epsilon\)(证bu明hui略zheng) 其中(我校学长把\(\epsilon(x)\)叫单位函数但是为什么我没 ...
- JdbcTemplate:Jdbc模板和数据库元数据
通过 Jdbc .C3P0 .Druid 的使用我们会发现即使我们做了工具的封装,但重复性的代码依旧很多.我们可以通过 JdbcTemplate 即 Jdbc 模板来使我们的代码更加简洁,逻辑更加清晰 ...
- Python随笔-切片
Python为取list部分元素提供了切片操作,list[begin:end]获取list的[begin,end)区间元素. 可以用负数索引. tuple.str都是list的一种,所以也适用. 可以 ...
- [Android]异常5-throwable:java.lang.OutOfMemoryError: pthread_create
背景:线程初始化耗时任务 异常原因: 可能一>多个new Thread()嵌套 解决办法有: 解决一>使用Handler分离new Thread()嵌套 注: 06-30 09:12:26 ...
- ajax不跳转页面的快速删除操作,可添加美观样式
以前我们讲的删除是利用嵌入php代码,跳转到另一个页面,从而降低了删除速度,但我们今天讲的利用ajax不仅可以达到不跳页面快速删除,并且能添加特效来美化页面. 上代码,我们先来做主页面 <!DO ...
- servlet-请求重定向
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...
- [Windows Server 2012] Filezilla安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...
- 14、Scala类型参数
1.泛型类 2.泛型函数 3.上边界Bounds 4.下边界Bounds 5.View Bounds 6.Context Bounds 7.Manifest Context Bounds 8.协变和逆 ...