修复公路
【題目描述】
給出A地區(qū)的村莊數(shù)N,和公路數(shù)M,公路是雙向的。并告訴你每條公路的連著哪兩個村莊,并告訴你什么時候能修完這條公路。詢問最早什么時候任意兩個村莊能夠通車,即最早什么時候任意兩條村莊都存在至少一條修復(fù)完成的道路(可以由多條公路連成一條道路)。
【輸入描述】
第1行兩個正整數(shù)N、M;
下面M行,每行3個正整數(shù)x、y、t,告訴你這條公路連著x、y兩個村莊,在時間t時能修復(fù)完成這條公路。
【輸出描述】
如果全部公路修復(fù)完畢仍然存在兩個村莊無法通車,則輸出-1,否則輸出最早什么時候任意兩個村莊能夠通車。
【輸入樣例】
4 4
1 2 6
1 3 4
1 4 5
4 2 3
【輸出樣例】
5
【數(shù)據(jù)范圍及提示】
N <= 1000,M <= 100000,x <= N,y <= N,t <= 100000。
源代碼:
#include<cstdio>
#include<algorithm>
using namespace std;
struct Node
{
int X,Y,S;
}i[100000];
int m,n,Num(0),ans,f[100000]={0};
bool Rule(Node t1,Node t2)
{
return t1.S<t2.S;
}
int Find(int t)
{
if (!f[t])
return t;
return f[t]=Find(f[t]);
}
int main() //Kruskal算法一改就好了。
{
scanf("%d%d",&n,&m);
for (int a=0;a<m;a++)
scanf("%d%d%d",&i[a].X,&i[a].Y,&i[a].S);
sort(i,i+m,Rule);
for (int a=0;a<m;a++)
{
int t1=Find(i[a].X);
int t2=Find(i[a].Y);
if (t1!=t2)
{
Num++;
f[t2]=t1;
ans=i[a].S;
if (Num==n-1)
break;
}
}
if (Num!=n-1)
printf("-1");
else
printf("%d",ans);
return 0;
}
總結(jié)
- 上一篇: 【音频处理】短时傅里叶变换
- 下一篇: 优酷广告