单源最短路径问题

单源最短路径问题_第1张图片

单源最短路径问题_第2张图片

 

 

  • 程序实现
#include 
#define M 65535 //一个无穷大的数,用来表示两个顶点之间没有连线时的权值
#define N 5 //顶点数

//Dijkstra算法函数,求给定源点到其余各顶点的最短路径
void Dijkstra(int c[N][N], int v, int dist[], int prev[])
{
    int s[N];//当前顶点i是否被选入S集合
    int mindis,dis; 
    int i, j, u;
    //对图进行赋初值
    for(i=0; i dis)
            {
                dist[j] = dis;
                prev[j] = u;
            }
        }
    }
}

// 输出最短路径
void PrintPrev(int prev[],int v0,int vn)
{
    int tmp = vn;
    int i, j;
    int tmpprv[N];//临时存储路径
    //初始化数组
    for(i=0; i < N; i++)
        tmpprv[i] = 0;
    //记录到达点下标
    tmpprv[0] = vn+1;
    //中间点用循环记录
    for(i =0, j=1; j < N ;j++)
    {
        if(prev[tmp]!=-1 && tmp!=0)
        {
            tmpprv[i] = prev[tmp]+1;
            tmp = prev[tmp];
            i++;
        }
        else break;
    }
    //输出路径,数组逆向输出
    for(i=N-1; i >= 0; i--)
    {
        if(tmpprv[i] != 0)
        { //排除0元素
            printf("V%d", tmpprv[i]);
            if(i) //不是最后一个输出符号
                printf("->");
        }
    }
    printf("->V%d", vn+1);
}

//主函数
int main()
{
    char *Vertex[N]={"V1", "V2", "V3", "V4", "V5"}; //有向图的顶点
    int c[N][N]=
    {//有向图的邻接矩阵,可以表示出顶点与顶点之间的权值,相当于给图赋初值
        {0, 10, M, 30, 100},
        {M, 0, 50, M, M},
        {M, M, 0, M, 10},
        {M, M, 20, 0, 60},
        {M, M, M, M, 0},
    };
    int dist[N]; //存放求得的最短特殊路径长度
    int prev[N];  //存放到达某一顶点的最佳路径上的该顶点的上一个点
    int i;//用来指代当前顶点,i的范围从0到有向图中顶点的个数-1

    //求出源点V1到其余各点的最短路径
    Dijkstra(c, 0, dist, prev);
     printf("最短路径长度为:\t\t");
     printf("最短路径为:");
     printf("\n");
    for(i=0; i < N; i++)
    {
        printf("%s->%s:%d\t\t", Vertex[0], Vertex[i], dist[i]);//输出最短路径长度
        PrintPrev(prev, 0, i);//输出最短路径
        printf("\n");
    }

    return 0;
}

 

  • 实验结果与分析

单源最短路径问题_第3张图片

单源最短路径问题_第4张图片

你可能感兴趣的:(算法分析)