Color Graph
Color Graph
https://ac.nowcoder.com/acm/contest/9855/K
题意:
给一个无向图n个点m条边,给一些边涂红色。要求红色边不能有奇环.求能染红的最多的边。
解题:
题目中讲到了奇环, 这很容易往二分图上想。
定理:一个无向图是二分图,当且仅当图中不存在奇环
接下里就是找是二分图的最多的边。
我们一般是分两个集合进行操作,在这个题中由于n最大值为16,所以我们可以用二进制进行枚举对n个点进行分集合操作。判断相连的两个点是否在一个集合中不在答案就++,最后求出所有情况下的最大值即为答案。
废话说多了上代码
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1e5 + 7; int u[maxn], v[maxn], vis[maxn]; int main (){ int T, cnt = 1; scanf ("%d", &T); while (T -- ){ int n, m; scanf ("%d%d", &n, &m); for (int i = 0; i < m; i ++ ) scanf ("%d%d", &u[i], &v[i]); int ans = 0; for (int i = 0; i < (1 << n); i ++ ){ //cout << i << endl; for (int j = 0; j < n; j ++ ) vis[j] = (i>>j&1); int sum = 0; for (int j = 0; j < m; j ++ ) if (vis[u[j]] != vis[v[j]]) sum ++; ans = max(ans, sum); } printf ("Case #%d: %d\n", cnt ++, ans); } }