解决这个问题其大概的思路还是和dijkstra——单源最短路径算法的思路差不多。
#include<stdio.h>
int main()
{
int dis[10],i,k,n,m,u[10],v[10],w[10],check,flag;/*u[i]用来存放初始城市位置,v[i]用来存终点城市的位置
w[i]用来存从u[i]到v[i]的路程即权值*/
int inf=9999999;
scanf("%d%d",&n,&m);//输入城市的个数以及街道的条数
for(i=1;i<=m;i++)
scanf("%d%d%d",&u[i],&v[i],&w[i]);
for(i=1;i<=n;i++)
dis[i]=inf;//初始化dis数组
dis[1]=0;
for(k=1;k<=n-1;k++)
{
check=0;/*check用来检查是否在n-1轮结束后dis数组中每一个数都已经归位,如果是
就提前结束循环,减少时间*/
for(i=1;i<=m;i++)
{
if(dis[v[i]]>dis[u[i]]+w[i])/*这一点跟dijkstra中类似,dis[v]>dis[u]+e[u][v];只不过这里用的是
v[i]来代替v,u[i]来代替u,w[i]来代替u到v的距离*/
{
dis[v[i]]=dis[u[i]]+w[i];
check=1;
}
}
if(check==0)
break;
}
flag=0;
for(i=1;i<=m;i++)
if(dis[v[i]]>dis[u[i]]+w[i])
flag=1;
if(flag==1)//如果在n-1轮循环结束后,dis数组里的数还可以变化的话,就一定存在负环
printf("含有负环\n");
else
{
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
}
return 0;
}