关键路径
描述:
计算AOE-网中关键路径的长度。
输入:
输入数据第一行是一个正整数,表示图中的顶点个数n(顶点将分别按0,1,…,n-1进行编号),顶点数不超过100,其中0为源点,n-1为汇点。之后的n行每行都包含n个整数,为AOE-网的邻接矩阵,其中0表示两个顶点间无直接可达的弧,大于0的整数表示活动持续的时间。
输出:
输出AOE-网中关键路径的长度,如果网中有环,则输出“NO”。
示例输入
9
0 6 4 5 0 0 0 0 0
扫描二维码关注公众号,回复:
7936574 查看本文章
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 2 0 0 0
0 0 0 0 0 0 9 7 0
0 0 0 0 0 0 0 4 0
0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 0
示例输出
18
输出说明:如果网中有环,则示例输出如下:
NO
#include<stdio.h> #include<stdlib.h> int main() { int i, j, n, count; int G[100][100]; int indegree[100] = { 0 }; int stack[100], top = -1; int ve[100]; scanf("%d", &n); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &G[i][j]); if(G[i][j]) indegree[j]++; } } for (i = 0; i < n; i++) { if (!indegree[i]) stack[++top] = i; } count = 0; while (top > -1) { i = stack[top--]; count++; for (j = 0; j < n; j++) { if (G[i][j]) { indegree[j]--; if (!indegree[j]) { stack[++top] = j; if (ve[j] < G[i][j] + ve[i]) ve[j] = G[i][j] + ve[i]; } } } } if (count < n) printf("NO\n"); else printf("%d", ve[n - 1]); return 0; }