20pts求条
查看原帖
20pts求条
846041
__xxy_free_ioi__楼主2025/2/5 09:58
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

int n, m, flag;
int cnt[N], deg[N];
vector<int> g[N];

bool judge(int deg[]) {
	for (int i = 1; i <= n; i++) {
		if (deg[i]) return 1;
	}
	return 0;
}

void cal(int id) {
	queue<int> q;
	memcpy(deg, cnt, sizeof cnt);
	for (int i = 1; i <= n; i++) {
		if (deg[i] == 0) q.push(i);
	}
	
	if (q.size() > 1) return;
	
	string ans = "";
	while (q.size()) {
		int u = q.front();
		q.pop();
		ans.push_back(u + 'A' - 1);
		
		for (auto v : g[u]) {
			if (deg[v] > 0) {
				deg[v]--;
				if (deg[v] == 0) q.push(v);
			}
		}
		
		if (q.size() > 1) return;
	}
	
	if (judge(deg)) {
		printf("Inconsistency found after %d relations.", id);
		flag = 1;
	}
	if (ans.size() == n) {
		printf("Sorted sequence determined after %d relations: ", id);
		cout << ans << '\n';
		flag = 1;
	}
}

int main() {
	cin >> n >> m;
	
	for (int i = 1; i <= m; i++) {
		char x, op, y;
		cin >> x >> op >> y;
		int u = x - 'A' + 1, v = y - 'A' + 1;
		if (op == '<') g[u].push_back(v), cnt[v]++;
		else g[v].push_back(u), cnt[u]++;
		
		cal(i);
		if (flag) break;
	}
	
	if (!flag) cout << "Sorted sequence cannot be determined.";
	return 0;
}
2025/2/5 09:58
加载中...