P3916 图的遍历
作者:互联网
P3916 图的遍历
题意:求各个点所能到达最大的编号
按正常情况去遍历图,会超时和爆内存,得到20分(起码我只拿了20)
换个思路来求,编号大的地点可以到达哪些点
思路:
- 反向建边
- 从编号大的点开始dfs,dfs传递初始编号d,这是遍历到的点的答案
- 若当前点被访问过了说明被更大的点访问过了,遂return结束
#include<iostream> #include<cstring> #include<vector> #include<set> #include<map> #include<queue> #include<algorithm> using namespace std; int n,m; vector<int> son[100010]; int ans[100010]; bool st[100010]; void dfs(int u,int d) { if(ans[u]) return; ans[u]=d; for(auto v:son[u]) if(st[v]==false) { st[v]=true; dfs(v,d); } } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; son[y].push_back(x); } for(int i=n;i>=1;i--) dfs(i,i); for(int i=1;i<=n;i++) cout<<ans[i]<<" "; cout<<endl; return 0; }
标签:遍历,int,dfs,son,P3916,ans,include 来源: https://www.cnblogs.com/magicat/p/16535165.html