关键路径
描述:
计算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
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;
}