题目描述:
小埋最近在学习有向图的遍历相关知识,小埋学习过图的遍历的相关方法,可以使用dfs或者bfs来遍历整个有向图,但是小埋发现这个问题有一些不一样,这个图的遍历是问你当前点能够到达的点的最大编号,小埋希望你能帮她解决这个问题。
输入格式:
第一行两个整数一个n一个m,n代表有向图中有n个点,m代表有向图中有m条有向边。
接下来是m条边。
输出格式:
输出每个点能够到达的最大编号
样例1输入:
4 3
1 2
1 3
2 3
样例1输出:
3 3 3 4
数据范围:
1<=n,m<=100000
代码如下:
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#pragma G++ optimize(3)
using namespace std;
vector<vector<int> > a(100005);
int n,m,u,v,dv[100005];
int d(int now)
{
if(dv[now])return 0;
if(a[now].empty())return now;
int ans=now;
for(int i=0;i<a[now].size();i++)
{
dv[now]=1;
ans=max(d(a[now][i]),ans);
dv[now]=0;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
a[u].push_back(v);
}
for(int i=1;i<=n;i++)
cout<<d(i)<<" ";
return 0;
}