AC

lzhh_lzhh26  •  1个月前


#include<bits/stdc++.h>
using namespace std;
int n,m;		//n点m边 
vector<int> d[100005];		//用邻接表存,d[i]表示i能去哪些点 
bool vis[100005];
int ans[100005];		//答案数组 
void dfs(int node){
	ans[node]=node;		// 初始标记为自身
	vis[node]=1;
	for(int i=0;i<d[node].size();i++){		//遍历字节点 
		if(vis[d[node][i]]==0){			//子节点没有走过 
			dfs(d[node][i]);	
			ans[node]=max(ans[node]/*它本身*/,ans[d[node][i]]/*子节点答案*/);	//抄子节点最大答案 
		}
	}
}
void dfs2(int node){
	vis[node]=1;
	for(int i=0;i<d[node].size();i++){		//遍历字节点 
		if(vis[d[node][i]]==0){			//子节点没有走过 
			dfs2(d[node][i]);	
		}
		ans[node]=max(ans[node]/*它本身*/,ans[d[node][i]]/*子节点答案*/);	//再抄一遍 
	}
}
int main(){
	cin>>n>>m;
	while(m--){
		int l,r;
		cin>>l>>r;	//有向图 
		d[l].push_back(r);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]) dfs(i);
	}
	memset(vis,0,sizeof vis);
	for(int i=1;i<=n;i++){
		if(!vis[i]) dfs2(i);		//答案没抄全,再抄一遍 
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<' ';
	} 
	return 0;
} 
/*
Q:
4 3
1 2
2 4
4 3


6 7
1 2
1 3
2 6
4 5
5 2
6 3
6 4
A:
4 4 3 4
*/

评论:

请先登录,才能进行评论