题目
解题思路
拓扑排序+DP求以v为终点的最长路径。
(拓展:反向建图可以求以v为起点的最长路径)
AC代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
int v, next;
} edge[200010];
int degree[100010];
int vis[100010];
int dp[100010];
int head[100010], ct = 1;
void add(int u, int v)
{
edge[ct].v = v;
edge[ct].next = head[u];
head[u] = ct++;
}
int n, m;
int rk[100010], cnt = 0;
void topological()
{
int id = 1;
for (int i = 1; i <= n; i++)
if (!degree[i])
rk[++cnt] = i, vis[i] = 1;
while (id <= n)
{
int pos = rk[id++];
for (int i = head[pos]; i; i = edge[i].next)
{
int v = edge[i].v;
degree[v]--;
if (degree[v] == 0)
rk[++cnt] = v, vis[v] = 1;
dp[v] = max(dp[v], dp[pos] + 1);
}
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int u, v;
scanf("%d %d", &u, &v);
degree[v]++;
add(u, v);
}
topological();
for (int i = 1; i <= n; i++)
printf("%d\n", dp[i] + 1);
return 0;
}