#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);
我先说了……
他遍历的没问题啊
而且我没看你的
#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);
}
}
你俩谁先解决算谁的吧…
加油…