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;
}
(废话不多说赶快自己动手试试)
能给个方案吗?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了吗?
没有
大哥
反向遍历
没事,没看见