题目描述
给出N个点,M条边的有向图,对于每个点v,求A(v)表示从点v出发,能到达的编号最大的点。
输入格式
第1 行,2 个整数N,M。
接下来M行,每行2个整数Ui,Vi,表示边(Ui,Vi)。点用1, 2,……,N编号。
输出格式
N 个整数A(1),A(2),……,A(N)。
输入
4 3
1 2
2 4
4 3
输出
4 4 3 4
反向建图!!!然后dfs遍历图。
#include<bits/stdc++.h>
using namespace std;
#define maxn 100010
vector<int>vt[maxn];
int ans[maxn];
int n,m;
void dfs(int x,int w)
{
if(ans[x])
return;
ans[x]=w;
for(int i=0;i<vt[x].size();i++)
dfs(vt[x][i],w);
}
int main()
{
int u,v;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
vt[v].push_back(u); // 建图
}
for(int i=n;i>=1;i--)
dfs(i,i);
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}