耗时种数 (弗洛伊德算法 最短路)
试题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;
}