为什么总是输出Impossible?
查看原帖
为什么总是输出Impossible?
608410
封禁用户楼主2022/10/22 21:55

RT

用的二分图方法

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
int n, m, ans;
int ran[2], col[maxn];// col标记每个点的染色情况                     ran标记染0,1色点分别的个数 
int to[maxn], h[maxn], nxt[maxn], tot;
bool f; //标记
void add(int u, int v) {
	tot++;
	to[tot] = v;
	nxt[tot] = h[u];	
	h[u] = tot;
}
void dfs(int u){
	for(int i = h[u];i;i = nxt[i]) {
		int v = to[i];//将要染色的点 
		if(col[u] == col[v]){f = 1;break;}//颜色重复说明不符合二分图的定义,直接返回输出impossible 
		else if(col[v] == -1){
			col[v] = (col[u] + 1) % 2;//将要染色的点染色 
			ran[col[v]]++;//记录该颜色的点的总个数 
			dfs(v); 
		}
	}
}
int main() {
	cin >> n >> m;
	int a, b;
	for(int i = 1;i <= m;i++) {
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	f = false; 
	memset(col, -1, sizeof(ran));//将所有点的颜色全部标记成-1,表示没有染过色 
	for(int i = 1;i <= n;i++) {//开始染色 
		col[i] = 0;ran[0] = 1;ran[1] = 0;//将第i个点的颜色初始化成0 
		dfs(i);
		if(f){ans = -1;break;}
		ans += min(ran[0], ran[1]);
	}
	if(ans == -1)cout << "Impossible" << endl;
	else cout << ans << endl;
	return 0;
}
2022/10/22 21:55
加载中...