注释掉的是加上的记忆化
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int head[100050];
/*int maxn[100050];*/
bool vis[100050];
struct edge
{
int from,to,nxt;
}e[100050];
void addedge(int u,int v)
{
e[++cnt].nxt=head[u];
e[cnt].from=u;
e[cnt].to=v;
head[u]=cnt;
}
int dfs(int s)
{
/*if(maxn[s]) return maxn[s];*/
int ans=s;
for(int i=head[s];i;i=e[i].nxt)
{
if(!vis[e[i].to])
{
vis[e[i].to]=1;
ans=max(ans,dfs(e[i].to));
}
}
return /*maxn[s]=*/ans;
}
int main()
{
int x,y;
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
addedge(x,y);
}
for(int i=1;i<=n;i++)
{
cout<<dfs(i)<<" ";
memset(vis,0,sizeof(vis));
}
}