关于求解哪些边是关键路径,可以参考我的这篇博客
这题只是上面这个代码的精简版,只求了长度,没求哪些是关键路径,所以只贴了个代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 5;
const int inf = 0x3f3f3f3f;
int n, m;
int mp[maxn][maxn];
int ve[maxn];
int into[maxn];//入度
//ve 是指从始点开始到顶点Vj的最大路径长度
void topo() {//拓扑排序求最大长度
for(int i = 0; i < n; i++) {
int k = -1;
for(int j = 0; j < n; j++) {
if(into[j] == 0) {
k = j;
into[j] = -1;
break;
}
}
for(int j = 0; j < n; j++) {
if(mp[k][j] != inf) {
ve[j] = max(ve[j], ve[k] + mp[k][j]);
into[j]--;
}
}
}
}
int main() {
while(~scanf("%d%d", &n, &m)) {
memset(mp, inf, sizeof(mp));
memset(into, 0, sizeof(into));
for(int i = 0; i <=n; i++) ve[i] = 1;//注意最小是1,并且下标是从0开始的
for(int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
mp[u][v] = w;
into[v]++;
}
topo();
int ans = 0;
for(int i = 0; i < n; i++) ans = max(ans, ve[i]);//遍历求一个最大值
printf("%d\n", ans);
}
return 0;
}