图论的T1,本蒟蒻都不会写,有没有大佬给我发个框架或是指导都行

void dfs(int x){
	if(ans[x]){
		return;
	}
	ans[x]=i;//雨露均沾,给这个点能到达的所有点中的所有点都算出来了 
	for(int i=0;i<g[x].size();i++){
		/*自己写*/
	}
}
for(i=n;i>=1;i--){
		if(!ans[i]){//没被遍历到 
			dfs(i);//遍历 
		}
	}

思路就是深搜,然后ans标记答案(也能起到vis的作用/0,从一个没被遍历过的点出发,遍历,这样能节省时间复杂度
给解决方案,谢谢

给你个基本适用所有题目的框架:

#include <bits/stdc++.h>
using namespace std;

int main() {
	//输入
	
	
	//搜索
	
	
	//输出
	
	
	return 0;
}

(废话不多说赶快自己动手试试) :grinning:

能给个方案吗?QWQ

稍微清楚点!

我改了

可以吗?

你的ans[x]=i是啥意思?

i是点,看下面的那个循环,这里的i是那个i
(说实话,我写的有点不严谨,dfs里面的那个循环不应该用i)
由于点是从大到小遍历的,所以第一个访问到的一定就是最大的(剩下的就被return掉了)

i不是在循环里吗?那这个i的值是啥

呃,我写的不太严谨,我改一下

int i;//i是在前面定义的
void dfs(int x){
	if(ans[x]){
		return;
	}
	ans[x]=i;//雨露均沾,给这个点能到达的所有点中的所有点都算出来了 
	for(int j=0;j<g[x].size();j++){//这里我不因该用i的,虽然正确,但是会引起误解QWQ
		/*自己写*/
	}
}
for(i=n;i>=1;i--){//上面ans[x]=i用到的i就是这里的i
		if(!ans[i]){//没被遍历到 
			dfs(i);//遍历 
		}
	}

我试试

废了

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

呃,我是这样写的:

int u=g[x][i];
		dfs(u);

你看,我是for(auto j:g[x])跟你不一样,j取得是下标

A了吗?

没有

大哥

反向遍历

没事,没看见