题目链接:https://www.luogu.com.cn/problem/P3916
想要找到当前点可达最远的点,正着看有些难做,但是正难则反,我们可以从反面来考虑,我们从最后一个结点开始遍历,先让每个结点都等于他自身,然后,看当前结点可以到达那个点P,点P可达的最大距离就是当前点。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; int n, m; int h[N], e[N], ne[N], idx; int d[N]; void add(int a, int b){ e[idx] = b; ne[idx] = h[a]; h[a] = idx ++; } void dfs(int x, int t){ if (d[x]) return; d[x] = t; for (int i = h[x]; ~i; i = ne[i]){ int j = e[i]; dfs(j, t); } } int main(){ cin >> n >> m; memset(h, -1, sizeof h); while (m -- ){ int a, b; cin >> a >> b; add(b, a); } for (int i = n; i >= 1; i -- ) dfs(i, i); /* 从大到小搜索,当前结点最大也就是到他本身了,当结点变小的时候, 如果结点的d已经被更新,则,存在当前点到一个最大点,否则,当前点 到当前点为最大的。 */ for (int i = 1; i <= n; i ++ ) cout << d[i] << ' '; return 0; }