URAL 2017 Best of a bad lot 二分图染色 使x集点数最少
2014-12-09 16:59
441 查看
题目链接:点击打开链接
题意:
有n个嫌疑犯。[1,n]
第i行表示第i个嫌疑犯说案发时他所在的地名,后面一个数m表示当时他看到m个人,后面m个数表示他看到的人。
找出最小的犯罪团体(即多数人都是好人原则)
若大家都是好人则随便输出一个人当坏人==
思路:
当一个人x被2个不同地方的人u, v看到时,则u v其中一个一定是犯人。
所以u-v建一条边。
然后二分图染色使得x点集点数最少。
先染一个子图,然后把点集少的归成x集就可以了,因为任意两个子图都是互不影响的。
题意:
有n个嫌疑犯。[1,n]
第i行表示第i个嫌疑犯说案发时他所在的地名,后面一个数m表示当时他看到m个人,后面m个数表示他看到的人。
找出最小的犯罪团体(即多数人都是好人原则)
若大家都是好人则随便输出一个人当坏人==
思路:
当一个人x被2个不同地方的人u, v看到时,则u v其中一个一定是犯人。
所以u-v建一条边。
然后二分图染色使得x点集点数最少。
先染一个子图,然后把点集少的归成x集就可以了,因为任意两个子图都是互不影响的。
#include<bits/stdc++.h> using namespace std; template <class T> inline bool rd(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template <class T> inline void pt(T x) { if (x <0) { putchar('-'); x = -x; } if (x>9) pt(x / 10); putchar(x % 10 + '0'); } const int N = 450; vector<int>D , G ; map<string, int> mp; int local , n; void input(){ for(int i = 1; i <= n; i++){ D[i].clear(); G[i].clear(); } mp.clear(); string u; int siz = 1; for(int i = 1, loc, v; i <= n; i++) { cin>>u; if(mp.count(u)) loc = mp[u]; else mp[u] = loc = siz++; local[i] = loc; rd(loc); while(loc--){ rd(v); D[v].push_back(i); } D[i].push_back(i); } } void build(){ for(int i = 1; i <= n; i++) for(int j = 0; j < D[i].size(); j++) for(int k = j + 1; k < D[i].size(); k++) { int u = D[i][j], v = D[i][k]; if(local[u]!=local[v]) G[u].push_back(v), G[v].push_back(u); } } int vis ; vector<int>col[2], one, ans; void bfs(int x){ col[0].clear(); col[1].clear(); col[0].push_back(x); vis[x] = 0; queue<int>q; q.push(x); while(!q.empty()){ int u = q.front(); q.pop(); for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(vis[v] == -1) { vis[v] = !vis[u]; q.push(v); col[vis[v]].push_back(v); } } } int mx = col[0].size()<col[1].size()? 0 : 1; for(int i = 0; i < col[mx].size(); i++) ans.push_back(col[mx][i]); } int main(){ while (~scanf("%d", &n)){ input(); build(); memset(vis, -1, sizeof vis); ans.clear(); for(int i = 1; i <= n; i++) if(vis[i] == -1) bfs(i); if(ans.size() == 0)ans.push_back(1); pt(ans.size()); puts(""); for(int i = 0; i < ans.size(); i++) printf("%d%c", ans[i], i+1==ans.size()? '\n':' '); } return 0; }
相关文章推荐
- URAL 2017 Best of a bad lot(二分图交叉染色)
- ural 2017 Best of a bad lot
- B - The Accomodation of Students (二分图染色判断+匈牙利算法)
- ural 1106. Two Teams 二分图染色
- HDOJ 题目2444 The Accomodation of Students(染色法判二分图,最大匹配)
- 二分图最大匹配(匈牙利算法) URAL 1721 Two Sides of the Same Coin
- 二分图点染色 BestCoder 1st Anniversary($) 1004 Bipartite Graph
- HUD 2444 The Accomodation of Students (二分图染色+最大匹配)
- ural 1106. Two Teams 二分图染色
- hdoj 2444 The Accomodation of Students 【黑白染色判二分图 + 最大匹配】
- HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
- HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
- HDU2444 The Accomodation of Students(染色法判断二分图)
- POJ 2942 Knights of the Round Table(点双联通+二分图+染色)
- poj 2942 Knights of the Round Table 【无向图求BCC + 黑白染色判断二分图】
- hdu 2444 The Accomodation of Students 染色判断是否为二分图
- POJ2942 Knights of the Round Table(点双连通分量 + 二分图染色)
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
- poj 2942 Knights of the Round Table Tarjan求点双联通分量+黑白染色二分图判断
- POJ 2942:Knights of the Round Table tarjan点双联通分量 二分图染色找奇环