1214: Around the world
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 47 Solved: 8
[Submit][Status][Web Board]
Description
现在地图上有N个城市(你所在的城市编号为1),但是你的汽车油箱容量只有V,你只能在到达每个城市时才能够补充满油箱。现在告诉你每两个城市之间所需要消耗的油量(两个城市之间的路可能不止一条,消耗的油量也可能不同),是否存在一种方案使你能够周游这N个城市(每个城市可以走多次)。
Input
多组样例到文件尾结束。
每组样例第一行输入N,M,V,表示城市数目,道路数,油箱容量。 2 <= N <= 10000, 1 <= M <= 50000, 1 <= V <= 1000。
接下来输入M行,每行包含Xi,Yi,Ci。表示城市Xi,Yi之间存在一条耗油量Ci的路。1<=X,Y<=N, 1<=Ci<=1000。
PS:道路是双向的。
Output
如果存在输出YES
否则输出NO
Sample Input
4 4 2
1 4 2
1 3 2
2 3 1
3 4 4
3 3 2
1 2 3
1 3 2
2 3 3
Sample Output
YES
NO
HINT
Source
tyh、
开始思路,就是用克鲁斯卡尔把边权值排序,小于V的从小到大连接,最后判断能不能形成最小生成树,结果TLE,RE。。。
换一种思路,并查集。。秒了。。。醉了
#include<cstdio>
#include<iostream>
int father[10010];
void init()
{
for(int i=1;i<=10010;i++)
father[i]=i;
}
int find_father(int x)
{
if(x==father[x])
return x;
else
return father[x]=find_father(father[x]);
}
void Merge(int x,int y)
{
x=find_father(x);
y=find_father(y);
if(x!=y)
father[x]=y;
}
int main()
{
int N,M,V;
while(scanf("%d %d %d",&N,&M,&V)!=EOF)
{
int cnt=0;
if(!(N||M||V)) break;
init();
for(int i=1;i<=M;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(c<=V)
Merge(a,b);
}
for(int i=1;i<=N;i++)
if(father[i]==i) cnt++;
if(cnt==1)
printf("YES\n");
else
printf("NO\n");
}
}