题目描述
给出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)。
输入输出样例
输入 #1复制
4 3
1 2
2 4
4 3
输出 #1复制
4 4 3 4
说明/提示
• 对于60% 的数据, 1≤N.M≤ 10^3;
• 对于100% 的数据, 1≤N,M≤10^5 。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define MAXL 100010
int N, M, A[MAXL];
vector<int> G[MAXL]; //vector存图
void dfs(int x, int d) {
if(A[x]) return; //访问过 就是不为0
A[x] = d;
for(int i=0; i<G[x].size(); i++)
dfs(G[x][i], d);
}
int main() {
int u, v;
scanf("%d%d", &N, &M);
for(int i=1; i<=M; i++) {
scanf("%d%d", &u, &v);
G[v].push_back(u); //反向建边
}
for(int i=N; i; i--)
dfs(i, i);
for(int i=1; i<=N; i++)
printf("%d ", A[i]);
printf("\n");
return 0;
}