(机考)关键路径

关键路径

描述:

计算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;
 }

  

猜你喜欢

转载自www.cnblogs.com/KIROsola/p/11909433.html