萌新缩点+dfs,样例过,提交全WA,求助
查看原帖
萌新缩点+dfs,样例过,提交全WA,求助
549846
dpACerFXing楼主2023/10/13 20:56
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstring>
# include<stack>
# include<queue>
# define endl "\n"
# define int long long
using namespace std;
const int maxn=100001;
struct Node{
	int u, v, next;
}edge[maxn], new_edge[maxn];
int head[maxn], new_head[maxn], cnt=0, t=0, new_cnt=0, tim=0, n, m;
int dfn[maxn], low[maxn], color[maxn], a[maxn], uu[maxn], vv[maxn], dp[maxn], used[maxn];
bool vis[maxn];
stack<int> s;
queue<int> q;
void add(int u, int v) {
	cnt++;
	edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u];
	head[u]=cnt;
}
void new_add(int u, int v) {
	new_cnt++;
	new_edge[new_cnt].u=u; new_edge[new_cnt].v=v; new_edge[new_cnt].next=new_head[u];
	new_head[u]=new_cnt;
}
void tarjan(int u, int fa) {
	int owie=u;
	vis[u]=true;
	dfn[u]=low[u]=++tim;
	s.push(u);
	for(int i=head[u]; i; i=edge[i].next) {
		int v=edge[i].v;
		if(!dfn[v]) {
			tarjan(v, u);
			low[u] = min(low[u], low[v]);
		}else if(vis[v]) low[u] = min(low[u], dfn[v]);
	}
	if(dfn[u]==low[u]) {
		t++; 
		while(true) {
			int temp=s.top(); s.pop();
			vis[temp]=0;
			color[temp]=t;
			a[t]=max(u, a[t]);
			if(temp==u) break;
		}
	}
}
void topsort(int u) {
	dp[u]=a[u];
	for(int i=new_head[u]; i; i=new_edge[i].next) {
		int v=new_edge[i].v;
		if(used[v]==u) continue;
		used[v]=u;
		if(!dp[v]) topsort(v);
		dp[u]=max(dp[u], dp[v]);
	}
}
signed main() {
	cin >> n >> m;
	for(int i=1; i<=m; i++) {
		cin >> uu[i] >> vv[i];
		add(uu[i], vv[i]);
	}
	for(int i=1; i<=n; i++)
		if(!dfn[i])
			tarjan(i, 0);
	for(int i=1; i<=m; i++) 
		if(color[uu[i]]!=color[vv[i]]) 
			new_add(color[uu[i]], color[vv[i]]);
	for(int i=1; i<=n; i++)
		if(!dp[i])
			topsort(i);
	for(int i=1; i<=n; i++) cout << dp[color[i]] << " ";
	return 0;
}
2023/10/13 20:56
加载中...