时间限制 : 1 秒
内存限制 : 128 MB
给出 NN 个点,MM 条边的有向图,对于每个点 vv,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点。
输入
第 11 行 22 个整数 N,MN,M,表示点数和边数。
接下来 MM 行,每行 22 个整数 Ui,ViUi,Vi,表示边 (Ui,Vi)(Ui,Vi)。点用 1,2,...,N1,2,...,N 编号。
输出
一行 NN 个整数 A(1),A(2),...,A(N)A(1),A(2),...,A(N)。
样例
输入
4 3 1 2 2 4 4 3
输出
4 4 3 4
提示
- 对于 60%60% 的数据,1≤N,M≤1031≤N,M≤103。
- 对于 100%100% 的数据,1≤N,M≤1051≤N,M≤105。
---------------------------------------------------------------------------------------------------------------------------------代码:
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+2;
int n,m,v[N];
vector<int>g[N];
void dfs(int x,int y)
{
if(v[x]!=0) return;
v[x]=y;
for(int i=0;i<g[x].size();i++) dfs(g[x][i],y);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
g[b].push_back(a);
}
for(int i=n;i>=1;i--)
{
dfs(i,i);
}
for(int i=1;i<=n;i++) cout<<v[i]<<" ";
return 0;
}