22 pts 求条
查看原帖
22 pts 求条
711887
lihl楼主2025/1/26 11:29
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'

constexpr int INF = 114514;
int f[1010],rks[1010];
bool flag[1010];

int contests[1010][1010];

int find(int x){
	return f[x] == x ? x : f[x] = find(f[x]);
}
void merge(int x,int y){
	// y 是 x 的祖先,说明 y 和 x 的祖先同祖 
	f[find(y)] = find(x);
	rks[y] = rks[x];
	rks[x] ++;
}
int main(){
	cin.tie(nullptr),cout.tie(nullptr);
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;i ++){
		f[i] = i;
		rks[i] = 1;
	}
	for(int i = 1;i <= m;i ++){
		int u,v;
		char c;
		cin >> u >> v >> c;
		if(c == 'T'){
			merge(u,v);
		}else{
			flag[v] = true;
			// 不能作为根节点 
		}
	}
	int minidx = INF,minid = INF;
	for(int i = 1;i <= n;i ++){
		contests[f[i]][rks[i]] = i;
		if(!flag[i]){ // 能作根节点 
			if(rks[i] < minidx){ // 秩小 
				minidx = rks[i];
				minid = i; 
			}
		}
	}
	if(minid == INF){
		cout << "NIE";
		return 0;
	}
	
	for(int i = 1;i <= n;i ++){
		if(!contests[f[i]][rks[i] - 1] && i != minid){
			cout << minid << endl;
			// 合不到任何一个节点上,但可以作为根节点的叶子节点 
		}
		else cout << contests[f[i]][rks[i] - 1] << endl;
	}
	return 0;
}
2025/1/26 11:29
加载中...