54.施工方案第二季(最小生成树)
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
查看运行结果
题目描述 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
错误代码:(总距离正确)
#include
using namespace std;
#include
#include
#include
#include
#include
#define maxn 100000
#define maxm 200000
struct Edge{
int u,v,next;
long long w;
};
Edge edge[2*maxm];
long long tot=0;
int visit[maxn]={0},head[maxn],man[maxn];
int maxdis[maxn],n,m;
void input();
void prim();
int main()
{
input();
prim();
printf("%lld\n",tot);
for(int i=2;i<=n;++i)
{
if(maxdis[i]!=0&&maxdis[i]
maxdis[1]=maxdis[i];
}
printf("%d\n",maxdis[1]);
return 0;
}
void input()
{
memset(maxdis,0,sizeof(maxdis));
int a,b;
long long c;
head[1]=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&a,&b,&c);
edge[i].u=a;edge[i].v=b;
edge[i].w=c;
edge[i].next=head[a];
head[a]=i;
if(c>maxdis[a])
maxdis[a]=c;
edge[i+m].v=a;edge[i+m].u=b;
edge[i+m].w=c;
edge[i+m].next=head[b];
head[b]=i+m;
if(c>maxdis[b])
maxdis[b]=c;
}
}
void prim()
{
memset(man,99,sizeof(man));
man[1]=0;
int k=1;
visit[k]=1;
tot+=man[k];
for(int i=2;i<=n-1;++i)
{
int minxx=999999;
for(int j=1;j<=n;++j)
{
if(!visit[j]&&man[j]
{
minxx=man[j];
k=j;
}
}
visit[k]=1;
tot+=man[k];
for(int j=head[k];j!=0;j=edge[j].next)
{
if(!visit[edge[j].v]&&edge[j].w
{
man[edge[i].v]=edge[j].w;
}
}
}
}
正确:
#include
#include
#include
#include
#include
#define maxn 100005
#define INF 0x7fffffff
long long cnt,head[maxn],fa[maxn],vis[maxn],down[maxn][2],up[maxn],dis[maxn];
int n,m;
struct node
{
int to;
int next;
int edge;
}e[maxn<<2];
struct ss
{
int x,y,z;
}a[maxn];
using namespace std;
void insert(int u,int v,int edge)
{
e[++cnt].to=v;
e[cnt].edge=edge;
e[cnt].next=head[u];
head[u]=cnt;
}
int find(int x)
{
if (fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
bool cmp(ss a,ss b)
{
return a.z
}
void dfs1(int rt)
{
vis[rt]=1;
for (int i=head[rt];i;i=e[i].next)
{
if (!vis[e[i].to]) dfs1(e[i].to);
else continue;
if (down[e[i].to][0]+e[i].edge>down[rt][0])
{
down[rt][1]=down[rt][0];
down[rt][0]=down[e[i].to][0]+e[i].edge;
}
else if (down[e[i].to][0]+e[i].edge>down[rt][1])
down[rt][1]=down[e[i].to][0]+e[i].edge;
}
}
void dfs2(int rt,int fat,int val)
{
vis[rt]=1;
long long tmp=0;
if (rt==1) up[rt]=0;
else
{
up[rt]=up[fat]+val;
if (down[fat][0]==down[rt][0]+val) tmp=down[fat][1]+val;
else tmp=down[fat][0]+val;
up[rt]=max(up[rt],tmp);
}
dis[rt]=max(up[rt],down[rt][0]);
for (int i=head[rt];i;i=e[i].next)
if (!vis[e[i].to]) dfs2(e[i].to,rt,e[i].edge);
}
int main()
{
scanf("%d%d",&n,&m);
long long ans2=INF;
for (int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+m+1,cmp);
for (int i=1;i<=n;i++) fa[i]=i;
int k=0,ans=0;
for (int i=1;i<=m;i++)
{
int fa1=find(a[i].x),fa2=find(a[i].y);
if (fa1==fa2) continue;
fa[fa2]=fa1;
insert(a[i].x,a[i].y,a[i].z);
insert(a[i].y,a[i].x,a[i].z);
k++;
ans+=a[i].z;
if (k==n-1) break;
}
printf("%lld\n",ans);
memset(vis,0,sizeof(vis));
dfs1(1);
memset(vis,0,sizeof(vis));
dfs2(1,0,0);
for (int i=1;i<=n;i++)
ans2=min(ans2,dis[i]);
printf("%lld",ans2);
return 0;
}
转载于:https://www.cnblogs.com/c1299401227/p/5370766.html
54.施工方案第二季(最小生成树)相关推荐
- codevs 1700 施工方案第二季
1700 施工方案第二季 2012年市队选拔赛北京 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description c国边防 ...
- codevs1700 施工方案第二季
题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案, ...
- 【codevs1700】施工方案第二季 MST+树的重心
题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案, ...
- 1700施工方案第二季{转nbsp;仕林}
总的来说,这是一道考图论知识的题,可以搜到很多关于树的直径的东西,以及一些证明,这是一道好题! program shigong; type arr=array[1..200000]of longint ...
- 尚硅谷面试第二季(周阳主讲)
尚硅谷面试第二季 1.volatile关键字 volatile是什么 volatile的作用 1.保证可见性 2.不保证原子性 3.禁止指令重排 DCL(单例模式双重锁) JMM模型 JMM是什么 J ...
- 第二季:7.怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集器的?谈谈你对垃圾收集器的理解?【Java面试题】
第二季:7.怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集器的?谈谈你对垃圾收集器的理解?[Java面试题] 前言 推荐 7.怎么查看服务器默认的垃圾收集器是那个?生产上如何配置垃圾收集 ...
- 《奋斗》第二季 陆涛和米莱结婚啦……
<奋斗>第二季剧情人物命运介绍. 陆涛刚到法国接到了华子向南打来的电话告知陆涛的父亲不幸去世了.陆涛认为是徐志森去世了.结果告知是陆亚迅去世了.陆涛极度伤心,决定回国参加丧礼.夏琳说等他事 ...
- 百度AI实战营第二季:AI技术商业落地指南
4月 20日,百度 AI开发者实战营第二季启动,再次召集全国各地技术管理者,在北京"整装待发",并将陆续登陆成都.杭州.深圳.在新一季的实战营中,百度 AI将与开发者.合作伙伴一起 ...
- 从全职高手开始的系统_动画全职高手第二季热血回归,腾讯视频的国漫IP全链路开发之道...
这个国庆档,国产动画在内容市场上的存在感比想象中更加有分量.电影市场上,动画IP电影<姜子牙>完成票房领跑,掀起观影热潮:动画番剧市场上,头部IP动画<全职高手>第二季时隔三年 ...
最新文章
- as3绘制抛物线(二)
- Revit API导出GBXML
- egg 自学入门demo分享
- Programming Computer Vision with Python (学习笔记六)
- Vim 实用技术,第 1 部分: 实用技巧
- 函数的递推matlab,关于递推最小二乘法辨识参数的matlab编程(含注释)
- Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)
- spring boot controller构造方法_面试前突击Spring,我只需要十分钟,那么你呢?
- 华为手机记事本导出_涨知识!原来华为手机自带的录音转文字这么好用,秒变会议神器...
- MySQL基础部分总结
- 史上最全的前端开发面试题(含详细答案)
- 一对多的两个表,查询主表的信息和主表在子表中的记录条数
- 自动化运维环境搭建过程
- php ueditor怎么用,ueditor PHP版本使用方法
- python机器学习依赖库
- 实时环境映射贴图(Real-time Evironmnet Mapping)
- gaster字体转换器_wingdings
- like语句太慢 sqlserver_MySQL Like模糊查询速度太慢如何解决
- 计算机网络实验:802.3协议分析和以太网
- 超美的天环星轨动态引导页html官网源码下载
热门文章
- hdu 1087 Super Jumping! Jumping! Jumping!
- vs2005 创建解决方案不显示,解决方案管理器中看不到解决方案节点的解决办法...
- Live Maps中国更新-为北京增加实时交通信息
- 简介DOTNET 编译原理 简介DOTNET 编译原理 简介DOTNET 编译原理
- RUNOOB python练习题3
- 前端电子书单大分享~~~
- KeyMob:为国内应用开发者管理的广告聚合平台
- 【转】测试工程师日常工作需要关注的问题
- 2sum、3sum、4sum以及任意连续的数的和为sum、任意连续或者不连续的数的和为sum...
- 基于KVM的虚拟化研究及应用