求调
查看原帖
求调
488052
FLY_lai楼主2023/10/23 22:08
#include <bits/stdc++.h>

using namespace std;
const int N = 1005;

int n, m;
vector<int> e[N];
vector<int> E[N];

int dfn[N], low[N], cur = 0;
int stk[N], tp = 0;
int cnt = 0;
vector<vector<int> > ANS;

void init() {
	ANS.clear();
	cur = tp = cnt = 0;
	for (int i = 1; i <= n; i++) {
		e[i].clear();
		E[i].clear();
		dfn[i] = low[i] = 0;
	}
}

int dfs(int x, int rt) {
	dfn[x] = low[x] = ++cur;
	stk[++tp] = x;
	for (int i = 0; i < e[x].size(); i++)
		if (!dfn[e[x][i]]) {
			low[x] = min(low[x], dfs(e[x][i], rt));
			if (low[e[x][i]] >= dfn[x]) {
				vector<int> tmp;
				tmp.push_back(x);
				while (true) {
					tmp.push_back(stk[tp]);
					if (stk[tp--] == e[x][i])
						break;
				}
				ANS.push_back(tmp);
			}
		}
		else
			low[x] = min(low[x], dfn[e[x][i]]);
	return low[x];
}

int vis[N] = {};
void chk(vector<int> v) {
	memset(vis, 0, sizeof vis);
	for (auto i: v)
		vis[i] = 1;
	for (auto i: v) {
		E[i].clear();
		for (auto j: e[i])
			if (vis[j] == 1)
				E[i].push_back(j);
	}
}

bool flg = true;
int mk[N];
void srh(int x, int lst) {
	mk[x] = 1 - mk[lst];
	for (auto i: E[x]) {
		if (mk[i] == -1)
			srh(i, x);
		else if (mk[i] == mk[x])
			flg = false;
	}
}
bool ans[N] = {};

int main() {
	while (true) {
		cin >> n >> m;
		if (n == 0 && m == 0)
			break;
		init();
		for (int i = 1, u, v; i <= m; i++) {
			cin >> u >> v;
			e[u].push_back(v);
			e[v].push_back(u);
		}
		for (int i = 1; i <= n; i++)
			if (!dfn[i])
				dfs(i, i);
		memset(ans, true, sizeof ans); 
		for (auto i: ANS) {
			flg = true;
			chk(i);
			for (auto j: i)
				mk[j] = -1;
			srh(i[0], 0);
			if (!flg) {
				for (auto j: i) {
					ans[j] = false;
				}
			}
		}
		int res = 0;
		for (int i = 1; i <= n; i++) {
			if (ans[i]) { 
				res++;
			}
		}
		cout << res << endl;
	}
	return 0;
}
2023/10/23 22:08
加载中...