题目描述
公园终于建好了,市政府要求任意两个公园之间必须连通,即公园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<iostream> #include<cstdio> #include<string.h> #include<algorithm> #define LL long long #define MAX 100010 using namespace std; int pre[1010]; int find(int a) { int r=a; while(r!=pre[r]) { r=pre[r]; } int i=a; int j; while(i!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } void join(int a,int b) { int x=find(a); int y=find(b); if(x!=y) pre[x]=y; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; int sum=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) pre[i]=i; for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); join(a,b); } for(int i=1;i<=n;i++) { if(i==pre[i]) sum++; } if(sum==1) printf("Yes\n"); else printf("No\n"); } return 0; }