Dijkstra算法最短路径C/C++实现

废话不说,直接上代码:

#include<iostream>

#define maxsize 65536
void dijkstra(int a,int b)
{
    int n,s,z,x,c,k,min,now;
    int P[b],D[b],S[b];
    int array[a][a];
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<a;j++)
        {
            array[i][j]=maxsize;
            array[i][i]=0;
        }
    }
    cout<<"请输入图是否是无向图(enter 0 ):";
    cin>>n;
    for(int i=0;i<b;i++)
    {
        cout<<"请输入第"<<i+1<<"条边的顶点和权值:";
        cin>>z>>x>>c;
        array[z-1][x-1]=c;                                                                                                                         
        {
            array[i][j]=maxsize;
            array[i][i]=0;
        }
    }
    cout<<"请输入图是否是无向图(enter 0 ):";
    cin>>n;
    for(int i=0;i<b;i++)
    {
        cout<<"请输入第"<<i+1<<"条边的顶点和权值:";
        cin>>z>>x>>c;
        array[z-1][x-1]=c;
        if(n==0)
            array[x-1][z-1]=c;
    }

    cout<<"你创建的图的对应矩阵如下:\n";
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<a;j++)
        {
            cout<<"\t"<<array[i][j];
        }
        cout<<endl;
    }
    cout<<"请输入源点号:";
    cin>>s;

    for(int i=0;i<a;i++)
    {
        S[i]=0;
        D[i]=array[s-1][i];
        if(D[i]!=maxsize)
            P[i]=s;
        else
            P[i]=0;
    }
    S[s-1]=1;
    P[s-1]=0;

    for(int i=0;i<a-1;i++)
    {
        min=maxsize+1;
        for(int j=0;j<a;j++)
        {
            if((!S[j])&&(D[j]<min))
            {
                min=D[j];
                k=j;
            }
        }
        S[k]=1;

        for(int j=0;j<a;j++)
        {
            if((!S[j])&&(D[j]>D[k]+array[k][j]))
            {
                D[j]=D[k]+array[k][j];
                P[j]=k+1;
            }
        }

    }

    for(int i=0;i<a;i++)
    {
        cout<<s<<"到"<<i+1<<"的最短路径是:"<<D[i]<<endl;
        cout<<"路径:"<<i+1;
        now=P[i];
        while(now!=0)
        {
            cout<<"<---"<<now;
            now=P[now-1];
        }
        cout<<endl;
    }
}

运行结果:
无向图

运行结果:

zhanghang@Ubuntu-14:~/data$ vim dijkstra.cpp 
zhanghang@Ubuntu-14:~/data$ vim dijkstra.cpp 
zhanghang@Ubuntu-14:~/data$ g++ dijkstra.cpp          
zhanghang@Ubuntu-14:~/data$ ./a.out          
请输入顶点数目:5
请输入边的条数:7
请输入图是否是无向图(enter 0 ):0
请输入第1条边的顶点和权值:1 2 5
请输入第2条边的顶点和权值:2 5 7
请输入第3条边的顶点和权值:4 5 3
请输入第4条边的顶点和权值:1 4 6
请输入第5条边的顶点和权值:1 3 4
请输入第6条边的顶点和权值:3 5 2
请输入第7条边的顶点和权值:2 3 1
你创建的图的对应矩阵如下:
        0       5       4       6       65536
        5       0       1       65536   7
        4       1       0       65536   2
        6       65536   65536   0       3
        65536   7       2       3       0
请输入源点号:1
1到1的最短路径是:0
路径:1
1到2的最短路径是:5
路径:2<---1
1到3的最短路径是:4
路径:3<---1
1到4的最短路径是:6
路径:4<---1
1到5的最短路径是:6
路径:5<---3<---1

接下来看看有向图:
在这里插入图片描述
运行结果如下:

zhanghang@Ubuntu-14:~/data$ ./a.out 
请输入顶点数目:5
请输入边的条数:7
请输入图是否是无向图(enter 0 ):2
请输入第1条边的顶点和权值:2 1 1
请输入第2条边的顶点和权值:2 4 3
请输入第3条边的顶点和权值:1 4 2
请输入第4条边的顶点和权值:1 3 10
请输入第5条边的顶点和权值:3 5 2
请输入第6条边的顶点和权值:4 5 8
请输入第7条边的顶点和权值:4 3 5
你创建的图的对应矩阵如下:
        0       65536   10      2       65536
        1       0       65536   3       65536
        65536   65536   0       65536   2
        65536   65536   5       0       8
        65536   65536   65536   65536   0
请输入源点号:1
1到1的最短路径是:0
路径:1
1到2的最短路径是:65536
路径:2
1到3的最短路径是:7
路径:3<---4<---1
1到4的最短路径是:2
路径:4<---1
1到5的最短路径是:9
路径:5<---3<---4<---1

猜你喜欢

转载自blog.csdn.net/qq_43260665/article/details/85204181