题目描述

给出 $N$ 个点,$M$ 条边的有向图,对于每个点 $v$,求 $A(v)$ 表示从点 $v$ 出发,能到达的编号最大的点。

输入格式

第 $1$ 行 $2$ 个整数 $N,M$,表示点数和边数。

接下来 $M$ 行,每行 $2$ 个整数 $U_i,V_i$,表示边 $(U_i,V_i)$。点用 $1,2,\dots,N$ 编号。

输出格式

一行 $N$ 个整数 $A(1),A(2),\dots,A(N)$。

样例 #1

样例输入 #1

4 3 1 2 2 4 4 3

样例输出 #1

4 4 3 4

提示

  • 对于 $60\%$ 的数据,$1 \leq N,M \leq 10^3$。

  • 于 $100\%$ 的数据,$1 \leq N,M \leq 10^5$。

题解

#include <bits/stdc++.h> #define AC return 0 using namespace std; int n, m, a[100010]; vector<int> q[100010]; void df(int x, int v) { a[x] = v; for (int i = 0; i < q[x].size(); i++) if (a[q[x][i]] == 0) df(q[x][i], v); } int main() { cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); q[v].push_back(u); } for (int i = n; i > -1; i--) if (a[i] == 0) df(i, i); for (int i = 1; i <= n; i++) printf("%d ", a[i]); cout << endl; // For Debugging AC; }