啊哈算法168页
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
int dis[10],i,k,n,m,u[10],v[10],w[10];
int inf=99999999;
int main()
{
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[1]=0;
//bellman-ford算法核心语句
for(k=1;k<=n-1;k++){
for(i=1;i<=m;i++)
{
dis[v[i]]=min(dis[u[i]]+w[i],dis[v[i]]);
}
}
for(i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
getchar();
getchar();
return 0;
}
//5 5 2 3 2 1 2 -3 1 5 5 4 5 2 3 4 3
170页
增加啦提前退出循环和判断是不是存在负权回路的操作;
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
int dis[10],i,k,n,m,u[10],v[10],w[10],check,flag;
int inf=99999999;
int main()
{
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[1]=0;
//bellman-ford算法核心语句
for(k=1; k<=n-1; k++)
{
check=0;
for(i=1; i<=m; i++)
{
if(dis[v[i]]>dis[u[i]]+w[i])
{
dis[v[i]]=dis[u[i]]+w[i];
check=1;
}
}
if(check==0) break;//如果数组dis没有更新,提前结束循环。
}
flag=0;
for(i=1; i<=m; i++)
{
if(dis[v[i]]>dis[u[i]]+w[i])
flag=1;
}
if(flag==1) printf("此图含有负权回路\n");
else
for(i=1; i<=n; i++)
{
printf("%d ",dis[i]);
}
getchar();
getchar();
return 0;
}
//5 5 2 3 2 1 2 -3 1 5 5 4 5 2 3 4 3
//5 5 2 3 2 1 2 -3 1 5 5 4 5 2 3 4 3