Bellman-Ford算法

/*设计思路:
从源点逐次绕过其他顶点,以缩短到达终点的
最短路径长度。
首先是初始化,然后就是做(n-1)次松弛操作(即对每个顶点做是否通过其他
顶点到达可以减少从源点到达该顶点的距离)


Bellman-Ford算法构造一个最短路径长度数组序列dist 1 [u], dist 2 [u], …, dist n-1 [u]。其中:
dist 1 [u]为从源点v到终点u的只经过一条边的最短路径长度,并有dist 1 [u] =Edge[v][u];
dist 2 [u]为从源点v最多经过两条边到达终点u的最短路径长度;
dist 3 [u]为从源点v出发最多经过不构成负权值回路的三条边到达终点u的最短路径长度;
……
dist n-1 [u]为从源点v出发最多经过不构成负权值回路的n-1条边到达终点u的最短路径长度;
算法的最终目的是计算出dist n-1 [u],为源点v到顶点u的最短路径长度。


void Grapt::BellmanFord(const int n,const int v)
{//在带权有向图中有的边有负的权值。从
//顶点v找到所有其他顶点的最短路径
for(int i=0;i<n;i++)//初始化
{
dist[i]=Edge[v][i];
if(i!=v&&dist[i]<MAX)
path[i]=v;
else path[i]=-1;
}
for(int k=2;k<n;k++)//进行n-1次更新
{
for(int u=0;u<n;u++)//每次更新都是对于每个点进行更新
{
if(u!=v)
for(i=0;i<n;i++)//其他点到目标点的距离加上其他点的dist值与目标点的
dist值比较,如果小于就更新,每次更新以为着通过几条表到达目标点得到
最短距离。
{
if(Edge[i][u]<MAXNUM&&dist[u]>dist[i]+Edge[i][u])
{
dist[u]=dist[i]+Edge[i][u];
path[u]=i;
//绕i的路径长度小,修改
}
}
}
}
}
*/
//下面是一个实例
#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAX 999999
using namespace std;
int map[100][100];
int dist[100];
int n;
void BellmanFord(int v)
{
    for(int i=1;i<=n;i++)
    {
        dist[i]=map[v][i];
       // cout<<dist[i]<<" ";
    }
    for(int k=1;k<=n;k++)
    {
        for(int u=1;u<=n;u++)
        {
            if(v!=u)
            {
                for(int i=1;i<=n;i++)
                {
                    if(map[i][u]<MAX&&dist[u]>dist[i]+map[i][u])
                    {
                        dist[u]=dist[i]+map[i][u];
                    }
                }
            }
        }
    }
}
int main()
{
    freopen("in.txt","r",stdin);
    while(scanf("%d",&n)==1)
    {
        //cout<<n<<endl;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)map[i][j]=0;
                else map[i][j]=MAX;
            }


        }
        int m;
        int b;
        scanf("%d%d",&m,&b);
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            map[u][v]=w;
        }
        BellmanFord(b);
        for(int i=1;i<=n;i++)
        {
           printf("%d ",dist[i]);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(算法,ini,Path)