CF Forming Teams
2012-08-28 10:27
225 查看
题意:http://codeforces.com/problemset/problem/216/B
将一堆人分成人数相等两组,每个人都有讨厌的人(讨厌是相互的),相互讨厌的人不能分为一组。问最少得让多少人休息才能分成人数相等的两堆。
题目中重要的条件是一个人只讨厌两个人,我没看见。。。。
解:
如果两个人在一个集合当中并且这个集合是奇数个元素的时候,得去掉一个人。
最后如果剩下的人是个奇数的话,再去掉一个人。
做题过程:
哎,居然把合并集合个数的代码写错了。。。呜呜呜。。。
将一堆人分成人数相等两组,每个人都有讨厌的人(讨厌是相互的),相互讨厌的人不能分为一组。问最少得让多少人休息才能分成人数相等的两堆。
题目中重要的条件是一个人只讨厌两个人,我没看见。。。。
解:
如果两个人在一个集合当中并且这个集合是奇数个元素的时候,得去掉一个人。
最后如果剩下的人是个奇数的话,再去掉一个人。
做题过程:
哎,居然把合并集合个数的代码写错了。。。呜呜呜。。。
/* Pro: 0 Sol: date: */ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <set> #include <vector> using namespace std; int n,m,k,p[110],num,g[110]; int find(int x){ return x==p[x] ? x : p[x]=find(p[x]); } int main(){ scanf("%d%d",&n,&m); for(int i = 1; i <= n;i ++) p[i] = i,g[i] = 1; int a; int b; int ans = 0; for(int i = 1; i <= m; i ++) { scanf("%d%d",&a,&b); int x = find(a); int y = find(b); // cout << x << " !!! " << y << endl; if(x == y){ // cout << g[x] << "@@@" << endl; if(g[x] % 2 == 1) ans ++; } else{ p[x] = y; g[y] += g[x];//神啊, 我刚开始写了个g[y] = x, 后来又写了个g[y] += x; 无语了。。。。 // cout << "g[" << y << "]=" << g[y] << endl; } } if((n - ans) % 2 == 1) ans ++; cout << ans << endl; return 0; }
相关文章推荐
- 【打CF,学算法——三星级】CodeForces 216B Forming Teams (图论)
- Codeforces Round #133 (Div. 2) B Forming Teams
- 并查集:Forming Teams(CF#133)
- UVA 10911 Forming Quiz Teams
- Forming Quiz Teams+uva+状态压缩
- UVA - 10911 Forming Quiz Teams 状态压缩
- uva10911 Forming Quiz Teams
- Uva 10911 Forming Quiz Teams
- UVa 10911 - Forming Quiz Teams
- UVA - 10911 Forming Quiz Teams
- Uva 10911 Forming Quiz Teams(状压dp 最优配对问题)
- uva 10911 - Forming Quiz Teams(记忆化搜索)
- Problem - 216B - Codeforces Forming Teams
- UVA 10911 Forming Quiz Teams(状压DP)
- UVA_10911_FormingQuizTeams
- uva10911 - Forming Quiz Teams(简单动归)
- UVa 10911 Forming Quiz Teams / 状态压缩DP
- UVA 10911 Forming Quiz Teams
- uva 10911 Forming Quiz Teams
- uva 10911 - Forming Quiz Teams(记忆化搜索)