hdu 4109 (求解关键路径长度)

关于求解哪些边是关键路径,可以参考我的这篇博客

这题只是上面这个代码的精简版,只求了长度,没求哪些是关键路径,所以只贴了个代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80823104