对于单源最短路径的问题,Dijkstra算法对于带负权边的图就无能为力了,而Bellman-Ford算法就可以解决这个问题。
Bellman-Ford算法:可以处理带负权边的图。
算法的实现模板:
typedef struct edge
{
int v; //起点
int u; //终点
int w;
}edge;
edge edges[20004];
int d[1004];
int maxData=1000000000; //此处特别注意,Bellman-Ford算法中不要使用0x7fffffff
int edgenum;
bool BellmanFord(int s)
{
int i,j;
bool flag=false;
for(i=1;i<n+1;i++)
{
d[i]=maxData; //其余点的距离设置为无穷
}
d[s]=0; //源点的距离设置为0
for(i=1;i<n;i++)
{
flag=false;
//优化:如果某次迭代中没有任何一个dzhi改变的话,则立即退出迭代而不需要把所有的n-1次迭代都做完
for(j=0;j<edgenum;j++)
{
if(d[edges[j].u]>d[edges[j].v]+edges[j].w);
{
flag=true;
d[edges[j].u]=d[edges[j].v]+edges[j].w
}
}
if(!flag) break;
}
for(i=0;i<edgenum;i++)
{
if(d[edges[i].v]<maxData && d[edges[i].u]>d[edges[i].v]+edges[i].w)
{
return false;
}
}
return true;
}
主函数中:
edgenum=0;
for(i=0;i<m;i++)
{
cin>>start>>end>>w;
edges[edgenum].v=start;
edges[edgenum].u=end;
edges[edgenum].w=w;
edgenum++;
}