耗时种数 (弗洛伊德算法 最短路)

试题I:耗时种数 25’
描述在这里插入图片描述

输出
输出一个整数答案

样例
输入复制
4 5
0 1 5
0 2 5
1 3 5
1 0 5
3 2 5
输出复制
2
输入复制
2 0
输出复制
0
提示
数据规模

对于100%的数据,2≤n≤100,数据保证没有自环,可能有重边
思路:典型的弗洛伊德算法 这里应注意的是 题目说了 会有重边 。

#include <stdio.h>
int n,m,dis[101][101],inf,a,b,c,ans[10005],Ans;
int min(int x,int y)
{
	return x<y?x:y;
}
int main()
{
	inf=1e9;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i==j)
				dis[i][j]=0;
			else
				dis[i][j]=inf;
		}
	}
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		dis[a][b]=min(dis[a][b],c);
	}
	for(int k=0;k<n;k++)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i!=j&&dis[i][j]!=inf&&!ans[dis[i][j]])
			{
				ans[dis[i][j]]=1;
				Ans++;
			}
		}
	}
	printf("%d",Ans);
	return 0;
}
原文地址:https://www.cnblogs.com/fxzemmm/p/14847990.html