最后一个点T
查看原帖
最后一个点T
958944
Union_Find楼主2023/10/13 23:11

记录

求求啦

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define ull unsigned long long
#define il inline
inline void rd(ll &x){
	x=0;
	char ch;
	for(ch=getchar();ch<'0'||ch>'9';ch=getchar());
	for(;ch>='0'&&ch<='9';ch=getchar())
		x=(x<<3)+(x<<1)+(ch&15); 
}
ll sta[500005], top;
struct Edge{
	ll v, b;
};
vector <Edge> e[100005];
ll n, m, u, v, idu[100005], odu[100005], flag, s, ff, t, del[100005];
bool cmp(Edge a, Edge b){
	return a.v < b.v;
}
void add(ll u, ll v){
	e[u].push_back(Edge{v, 0});
}
void dfs(ll x){
	ll tot = e[x].size();
	for (int i = del[x]; i < tot; i++){
		ll v = e[x][i].v;
		if (e[x][i].b) continue;
		e[x][i].b = 1;
		del[x] = i + 1;
		dfs(v);
	}
	sta[++top] = x;
}
int main(){
	rd(n), rd(m);
	for (int i = 1; i <= m; i++){
		rd(u), rd(v);
		add(u, v);
		odu[u]++, idu[v]++;
	}
	s = t = 1, flag = 0, ff = 0;
	for (int i = n; i >= 1; i--){
		sort (e[i].begin(), e[i].end(), cmp);
		if (odu[i] == idu[i] + 1)
			flag++, s = i;
		if (idu[i] == odu[i] + 1)
			ff++, t = i;
	}
	if (!((flag == 0 && ff == 0) || (flag == 1 && ff == 1))) return 0 & puts("No");
	dfs(s);
	while (top) printf ("%lld ", sta[top--]);
	return 0;
}

2023/10/13 23:11
加载中...