P1111 修复公路 (prim)
生活随笔
收集整理的這篇文章主要介紹了
P1111 修复公路 (prim)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目背景
A地區(qū)在地震過后,連接所有村莊的公路都造成了損壞而無法通車。政府派人修復(fù)這些公路。
題目描述
給出A地區(qū)的村莊數(shù)N,和公路數(shù)M,公路是雙向的。并告訴你每條公路的連著哪兩個(gè)村莊,并告訴你什么時(shí)候能修完這條公路。問最早什么時(shí)候任意兩個(gè)村莊能夠通車,即最早什么時(shí)候任意兩條村莊都存在至少一條修復(fù)完成的道路(可以由多條公路連成一條道路)
輸入輸出格式
輸入格式:
第1行兩個(gè)正整數(shù)N,M
下面M行,每行3個(gè)正整數(shù)x, y, t,告訴你這條公路連著x,y兩個(gè)村莊,在時(shí)間t時(shí)能修復(fù)完成這條公路。
輸出格式:
如果全部公路修復(fù)完畢仍然存在兩個(gè)村莊無法通車,則輸出-1,否則輸出最早什么時(shí)候任意兩個(gè)村莊能夠通車。
輸入輸出樣例
輸入樣例#1: 復(fù)制
4 4
1 2 6
1 3 4
1 4 5
4 2 3
輸出樣例#1: 復(fù)制
5
說明
N<=1000,M<=100000
x<=N,y<=N,t<=100000
code:
#include<cstdio> const int inf=0x3f3f3f3f; int n,m,cnt,sum; int vis[1005],head[1005],mincost[1005],mst[1005];struct edg{int to,next,time; }edge[200010];void add(int x,int y,int t){edge[++cnt].next=head[x];edge[cnt].to=y;edge[cnt].time=t;head[x]=cnt; }void prim(int x){if(cnt==n-1) return ;cnt++;for(int i=head[x];i;i=edge[i].next)if(!vis[edge[i].to]&&edge[i].time<mincost[edge[i].to])mst[edge[i].to]=x,mincost[edge[i].to]=edge[i].time;int minn=inf,minst;for(int i=1;i<=n;i++)if(mst[i]&&minn>mincost[i])minn=mincost[i],minst=i;if(sum<minn) sum=minn;vis[minst]=1,mst[minst]=0;prim(minst); }int main(){scanf("%d %d",&n,&m);for(int i=1;i<=m;i++){int a,b,c;scanf("%d %d %d",&a,&b,&c);add(a,b,c);add(b,a,c);}for(int i=1;i<=n;i++) mst[i]=inf;for(int i=1;i<=n;i++) mincost[i]=inf;cnt=0,vis[1]=1;prim(1);for(int i=1;i<=n;i++) if(!vis[i]){printf("-1");return 0;}printf("%d",sum);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Menteur-Hxy/p/9248029.html
總結(jié)
以上是生活随笔為你收集整理的P1111 修复公路 (prim)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页打开微信链接 无法返回
- 下一篇: 微信支付小程序版