CodeForces 216B Forming Teams(并查集判断奇数环)
2015-04-07 19:19
459 查看
题意:有一群人要踢足球,但是在这些人中有几对人存在敌对的关系,要求每个队的人数相等并且同一个队中不存在互为敌对关系的人,每个人最多只会讨厌两个人,如果a讨厌b,那么b也会讨厌a,问你至少有多少人不能参加比赛。
思路分析:判断奇数环,当加入一条边时,判断这条边连接的点是否在同一个集合中,如果不在同一个集合则加入,如果两个点在同一个集合中,则判断根节点的子节点数,如果是奇数,这这条边不能加入,说明有一个人不能参加(画画图就知道了),最后再判断总体的人数是否是偶数。
代码实现:
思路分析:判断奇数环,当加入一条边时,判断这条边连接的点是否在同一个集合中,如果不在同一个集合则加入,如果两个点在同一个集合中,则判断根节点的子节点数,如果是奇数,这这条边不能加入,说明有一个人不能参加(画画图就知道了),最后再判断总体的人数是否是偶数。
代码实现:
#include<stdio.h> #include<string.h> int fa[110],total[110],n,m; int Find(int a){ return a==fa[a]?fa[a]:fa[a]=Find(fa[a]); } int main(){ while(~scanf("%d%d",&n,&m)){ int a,b; for(int i=1;i<=n;i++){ fa[i]=i; total[i]=1; } int sum=0; while(m--){ scanf("%d%d",&a,&b); int x=Find(a); int y=Find(b); if(x!=y){ fa[x]=y; total[y]+=total[x]; total[x]=1; } else{ if(total[x]%2){ sum++; //printf("**%d %d\n",total[x],sum); } } } if((n-sum)%2) sum++; printf("%d\n",sum); } }
相关文章推荐
- codeforces 688C C. NP-Hard Problem(bfs判断奇数长度环)
- CodeForces 699D 并查集+判断环
- Codeforces 228E The Road to Berland is Paved With Good Intentions 枚举dfs判断可行性 || 并查集
- CodeForces 209C Trails and Glades(欧拉回路判断+并查集计算联通分量)
- CodeForces 699D—— Fix a Tree(并查集判断环)
- JavaScript使用位运算符判断奇数和偶数的方法
- Codeforces 437D The Child and Zoo(贪心+并查集)
- HDU 1272 小希的迷宫 并查集 (判断任意2个点是否有且仅有一条路径可以相通)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- Ice_cream's world I(并查集之判断有几个圈)
- codeforces-A Trivial Problem 判断n!末尾0的个数模板
- CodeForces 566 D.Restructuring Company(并查集)
- CodeForces - 731C Socks(并查集)(贪心)
- POJ 2513 (Trie树+欧拉通路+并查集判断连通)
- POJ 2513 (Trie树+欧拉通路+并查集判断连通)
- POJ 1127 基础计算几何(判断两线段相交)+并查集
- HDU 1856 More is better(并查集判断集合元素个数)
- [欧拉回路 并查集] Codeforces 547D #305 (Div. 1) D. Mike and Fish
- nyoj 42 一笔画问题 dfs或并查集判断连通
- CodeForces 277A Learning Languages (并查集)