举杯消愁愁更愁,月底账单入水流 • 8个月前
#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
*/
评论:
请先登录,才能进行评论