1284: Vegetable and Road [并查集]
时间限制: 1 Sec 内存限制: 128 MB题目描述
公园终于建好了,市政府要求任意两个公园之间必须连通,即公园A到公园B至少有一条马路(并不是要求直接相连,可以通过其他公园间接相连)。
Vegetable接下来这个任务,并设计出了对应的修路方案,下面你需要判断Vegetable的方案是否可行。
注意:两个公园直接可以存在多条路。
输入
有T组测试数据,每组测试数据有一组N(0<n<=1000)和M。
N表示有N个公园,编号为1~N,M表示这N个公园之间有M条路。
下面再给出M组A和B,表示公园A和公园B之间有一条路。
输出
判断所有公园是否全部连通,是输出Yes,不是输出No。
样例输入
1
4 3
1 2
2 3
3 4
样例输出
Yes
思路:并查集模板;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;
int pre[1010];
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
int main()
{
int n,m,t,p1,p2;
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=1010;i++)
pre[i]=i;
scanf("%d %d",&n,&m);
int tot=n-1;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&p1,&p2);
int fx=find(p1);
int fy=find(p2);
if(fx!=fy)
{
pre[fy]=fx;
tot--;
}
}
if(!tot) printf("Yes\n");
else printf("No\n");
}
return 0;
}