uva 11080 - Place the Guards(二分图染色)
2015-09-11 20:52
225 查看
题目链接:uva 11080 - Place the Guards
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 205;
int N, M, B, W, C[maxn];
vector<int> G[maxn];
void init () {
scanf("%d%d", &N, &M);
memset(C, 0, sizeof(C));
for (int i = 0; i < N; i++) G[i].clear();
int u, v;
while (M--) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
}
bool bipartite(int u) {
if (C[u] == 1) B++;
else W++;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (C[v] == C[u]) return false;
if (!C[v]) {
C[v] = 3 - C[u];
if (!bipartite(v)) return false;
}
}
return true;
}
int solve () {
int ans = 0;
for (int i = 0; i < N; i++) {
if (C[i] == 0) {
B = W = 0;
C[i] = 1;
if (!bipartite(i)) return -1;
ans += max(1, min(B, W));
}
}
return ans;
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
printf("%d\n", solve());
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 205;
int N, M, B, W, C[maxn];
vector<int> G[maxn];
void init () {
scanf("%d%d", &N, &M);
memset(C, 0, sizeof(C));
for (int i = 0; i < N; i++) G[i].clear();
int u, v;
while (M--) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
}
bool bipartite(int u) {
if (C[u] == 1) B++;
else W++;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (C[v] == C[u]) return false;
if (!C[v]) {
C[v] = 3 - C[u];
if (!bipartite(v)) return false;
}
}
return true;
}
int solve () {
int ans = 0;
for (int i = 0; i < N; i++) {
if (C[i] == 0) {
B = W = 0;
C[i] = 1;
if (!bipartite(i)) return -1;
ans += max(1, min(B, W));
}
}
return ans;
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
printf("%d\n", solve());
}
return 0;
}
相关文章推荐
- 主流数据技术--JSON数据解析--原生解析
- 在 Linux 中使用日志来排错
- 在触发思考
- ubuntu 14.04启动进入命令行界面
- Asp.net中GridView使用详解
- X64编程总结
- 【最小费用流】【模板】
- HDU 1241 【搜索 水】
- Java心得31
- 屏幕适配——Drawable 资源
- 你所不知道的__ block 内幕
- IOS视图之UI基础
- navigationBar设置透明
- leetcode - Jump Game II
- proc-pid-mem
- 序列化二叉树
- R数组操作:截取大于x的所有数值
- linux 查找出包含某个字符串的所有文件的方法详解
- uva 10972 - RevolC FaeLoN(双联通)
- C/C++