题目链接:https://odzkskevi.qnssl.com/7bdafb89605bd39aff640413e2d2157a?v=1488601228。
题意:大意就是有n个飞机场,每个飞机场可能有个休息室,然后给你m组关系,每组关系有3个数x,y,z,表示若z=0,表示x、y飞机场都没有休息室。若z=1,表示x、y其中有一个有休息室,若z=2,表示两个都有休息室。问总共最少有几个休息室。
思路:讲道理这题不难,就是比较烦。很明显题目看完就能想到,这是一个判断是否是二分图的问题,用染色法解决就好了。但是他要求出最少的休息室是多少,这里比较难说明怎么处理,看代码吧:
#include<iostream>
#include<cmath>
#include<queue>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<utility>
#include<map>
#define maxn 200005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-8;
int vis[maxn], head[maxn], x[maxn], y[maxn], edge[maxn], sum, ans;
struct node{
int v, next;
}p[maxn << 1];
bool dfs(int x){
for (int i = head[x]; ~i; i = p[i].next){
int next = p[i].v;
if (~vis[next]){
if (vis[next] == vis[x])
return false;
}
else{
vis[next] = !vis[x];
sum++;
if (vis[next])
ans++;
if (!dfs(next))
return false;
}
}
return true;
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
memset(head, -1, sizeof(head));
memset(vis, -1, sizeof(vis));
int len = 0;
int len1 = 0, len2 = 0;
bool jud = true;
while (m--){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
if (w == 2){
if (vis[u] == -1){
vis[u] = 1;
ans++;
x[len1++] = u;
}
else if (!vis[u]){
jud = false;
}
if (vis[v] == -1){
x[len1++] = v;
ans++;
vis[v] = 1;
}
else if (!vis[v]){
jud = false;
}
}
else if (!w){
if (vis[u] == -1){
vis[u] = 0;
y[len2++] = u;
}
else if (vis[u]){
jud = false;
}
if (vis[v] == -1){
vis[v] = 0;
y[len2++] = v;
}
else if (vis[v]){
jud = false;
}
}
else{
p[len].v = v;
p[len].next = head[u];
head[u] = len++;
p[len].v = u;
p[len].next = head[v];
head[v] = len++;
}
}
if (!jud){
printf("impossible\n");
return 0;
}
for (int i = 0; i < len1; i++){
if (!dfs(x[i])){
jud = false;
break;
}
}
for (int i = 0; i < len2; i++){
if (!dfs(y[i])){
jud = false;
break;
}
}
for (int i = 1; i <= n; i++){
if (~vis[i])
continue;
vis[i] = 1;
sum = 1;
int now = ans++;
if (!dfs(i)){
jud = false;
break;
}
ans = min(ans, sum - ans + now + now);
}
if (jud){
printf("%d\n", ans);
}
else{
printf("impossible\n");
}
}