围巾的纠结(并查集之非完整集合的子集合是否连成圈的问题)
2015-04-01 13:13
246 查看
围巾的纠结 | ||||||
| ||||||
Description | ||||||
小破想要织一条围巾,可是她并不擅长于织围巾。由于工作太忙,每天她都只能织一点。为了快速的织完围巾,她决定直接把毛线球连在一起。围巾上有球球还是非常可爱的嘛~ 于是小破去商店买了n个毛线球。每天晚上睡觉之前,她就抽出一点时间,把其中两个原本分开的毛线球织在一起。由于是睡觉之前干活,人太困了,过了m天之后,她发现自己完全织乱了,于是她决定拆掉重织。可是由于她的织法过于特殊,她发现,一旦几个毛线球被织成了一个圈,就不能完好的解开了。现在她想知道,她还能把这条"围巾"还原吗? | ||||||
Input | ||||||
多组测试数据 每组测试数据第一行有两个整数n,m(1 <= n <= 10000, 1 <= m <= 1000000) 接下来有m行,每行有两个数a,b,表示将a和b号毛球织到一起。 | ||||||
Output | ||||||
对于每组测试数据,如果她能还原,则输出"YES", 否则输出"NO" | ||||||
Sample Input | ||||||
5 4 1 2 2 3 3 1 1 4 5 4 1 2 2 3 3 4 4 5 | ||||||
Sample Output | ||||||
NO YES | ||||||
Source |
球,所以我们做的应该是判断m天之内的球是否有连成一个圈
的情况发生!
#include<stdio.h> #include<string.h> int a[10009]; int Find(int x) { int r=x; while(r!=a[r]) r=a[r]; /* int i=x,j; while(a[i]!=r) { j=a[i]; a[i]=r; i=j; }*/ return r; }//这个就是找老大的函数,什么时候停止?就是当一个人的老大是他自己的时候! void mix(int x,int y) { int fx=Find(x),fy=Find(y);//首先要找到他们各自的老大 if(fx!=fy)//如果他们的老大不相等,要合并就必须其中的一个老大向另外一个老大称老大 { a[fy]=fx; // sum++; } } int main() { int n,m,i,j,c,d,flag; while(scanf("%d%d",&n,&m)!=EOF) { flag=0; memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { a[i]=i; } for(j=1;j<=m;j++) { scanf("%d%d",&c,&d); int fx=Find(c);int fy=Find(d);//首先要找到他们各自的老大 // printf("%d %d\n",fx,fy); if(fx==fy)//如果他们的老大不相等,要合并就必须其中的一个老大向另外一个老大称老大 { flag=1; } else { a[fx]=fy; } //mix(c,d); } // printf("%d\n",sum); if(flag==0) { printf("YES\n"); } else { printf("NO\n"); } } }好吧,那你肯定又问了,既然与n没有关系,能不能判断m天之内
的情况呢?答案是肯定的,只要m天之内的子集合没有练成一个圈
不就可以了吗?嘿嘿,确实是这样的!下面发一下代码!
#include<stdio.h> #include<string.h> int a[10009],sum; int Find(int x) { int r=x; while(r!=a[r]) r=a[r]; /* int i=x,j; while(a[i]!=r) { j=a[i]; a[i]=r; i=j; }*/ return r; }//这个就是找老大的函数,什么时候停止?就是当一个人的老大是他自己的时候! void mix(int x,int y) { int fx=Find(x),fy=Find(y);//首先要找到他们各自的老大 if(fx!=fy)//如果他们的老大不相等,要合并就必须其中的一个老大向另外一个老大称老大 { a[fy]=fx; // sum++; } } int main() { int n,m,i,j,c,d; while(scanf("%d%d",&n,&m)!=EOF) { sum=0; memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { a[i]=i; } for(j=1;j<=m;j++) { scanf("%d%d",&c,&d); int fx=Find(c);int fy=Find(d);//首先要找到他们各自的老大 // printf("%d %d\n",fx,fy); if(fx!=fy)//如果他们的老大不相等,要合并就必须其中的一个老大向另外一个老大称老大 { a[fx]=fy; sum++; } //mix(c,d); } // printf("%d\n",sum); if(sum==m) { printf("YES\n"); } else { printf("NO\n"); } } }
相关文章推荐
- 通信系统(并查集之满集合的子集合是否连成圈的问题)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- 检查图片是否完整(图片下载, 只有半张图问题)
- 哈理工OJ 2238—围巾的纠结(并查集判环)
- (用树结构支持并查集8.2.2)POJ 1703 Find them, Catch them(并查集的简单使用: 判断两个元素是否属于同一集合)
- ccsu1359 木棒相交 (叉积线段判交,并查集判断是否属于同一个集合)
- 判断一个list集合是否为空,用isEmpty 还是 null的问题
- 你是否也曾纠结pdf复制到word格式混乱的问题
- 我纠结的sql返回受影响行数与判断是否成功的问题
- 并查集初学——围巾的纠结
- 2018年全国多校算法寒假训练营练习比赛(第五场)D-集合问题(好强的并查集)
- 哈理工 校赛(热身赛)2238 围巾的纠结(判断回路问题)
- 哈理工oj hrbust 2238 围巾的纠结【并查集】