不多说了,T1,召唤兽:杨思越!!!

#include <bits/stdc++.h>
using namespace std;
vector<int> g[100005];
int n,m,u,v,vis[100005];
int ans,start,f[100005];
int dfs(int x){
	if(f[x])return f[x];
	f[x]=x;
	for(int i=0;i<g[x].size();++ i){
		int u=g[x][i];f[x]=max(f[x],dfs(u));
	}
	return f[x];
}
int main(){
	cin >> n >> m;
	while(m--){
		cin>>u>>v;
		g[u].push_back(v);
	}
	for(start=n;start>=1;start--)dfs(start);
	for(start=1;start<=n;start++)cout<<f[start]<<" ";
	return 0;
}

别用记搜!

会错!

感谢杨某的辛勤助力,忘了说,我之前试过把存图里的u,v调换,但是没用,样例都没了……
现在样例是对的

要反向建边

void dfs(int x){
	if(ans[x]){
		return;
	}
	ans[x]=i;//雨露均沾,给这个点能到达的所有点中的所有点都算出来了 
	for(int i=0;i<g[x].size();i++){
		int u=g[x][i];
		dfs(u);
	}
}

深搜部分的ans(也就是f)不用算max,直接赋值就好

void dfs(int x,int k){
	if(dis[x]){
		return;
	}
	dis[x]=k;
	for(int v:g[x]){
		dfs(v,k);
	}
}

注意:从大到小遍历!

否则会错

还需要反向建图
g[v].push_back(u);

我先说了……

?我试试


666

他遍历的没问题啊
而且我没看你的

#include <bits/stdc++.h>
using namespace std;
vector g[100005];
int n,m,u,v,vis[100005];
int ans,start,f[100005];
int dfs(int x){
f=x;
for(int i=0;i<g.size();++ i){
int u=g[i];f=max(f,dfs(u));
}
return f;
}
int main(){
cin >> n >> m;
while(m–){
cin>>u>>v;
g[v].push_back(u);
}
for(start=n;start>=1;start–)dfs(start);
for(start=1;start<=n;start++)cout<<f[start]<<" ";
return 0;
}

其实你的dfs可以改成void

格式化!!!

#include <bits/stdc++.h>
using namespace std;
vector<int> g[100005];
int n,m,u,v,vis[100005];
int ans,start,f[100005];
int dfs(int x){
	f[x]=x;
	for(int i=0;i<g[x].size();++ i){
		int u=g[x][i];f[x]=max(f[x],dfs(u));
	}
	return f[x];
}
int main(){
	cin >> n >> m;
	while(m--){
		cin>>u>>v;
		g[v].push_back(u);
	}
	for(start=n;start>=1;start--)dfs(start);
	for(start=1;start<=n;start++)cout<<f[start]<<" ";
	return 0;
}

这就是你们改的结果,666

《苍天已死,黄巾当立》,电死你们算了…(doge)

不是?!
是:

void dfs(int x,int k){
	if(dis[x]){
		return;
	}
	dis[x]=k;
	for(int v:g[x]){
		dfs(v,k);
	}
}

你俩谁先解决算谁的吧…
加油…