数据结构之Dijkstra算法

来源:互联网 发布:最好的网络电话软件 编辑:程序博客网 时间:2024/05/16 19:22

单源最短路径

通常称有向路径上的第一个顶点为源点,称最后一个顶点为终点。从某个源点到其他顶点的最短路径又称为单源最短路径。
单源最短路径的问题:给定一个带权图G=(V,E)和图中的一个原点V1,分别求出从V1到图G中其他每个顶点的最短路径长度,即路径上权值的总和。

Dijkstra算法基本思想

设置俩个顶点的集合S和T=V-S,集合S中存放已找到最短路径的顶点,集合T中存放当前还未找到最短路径的顶点。初始状态下,集合S中只包含源点V1,然后不断从集合T中选取到顶点V1路径长度最短的顶点Vi加入到集合S中,集合S 每加入一个新的顶点Vi,都要修改顶点Vi到集合T中剩余顶点的最短路径长度值,集合T中各顶点新的最短路径长度值为原来的最短路径长度值与顶点Vi的最短路径长度值加上Vi到该顶点的路径长度值中较小值。此过程不断重复,直到集合T的顶点全部加入集合S中为止。

算法辅助图:
这里写图片描述

完整代码

#include<stdio.h>#define max 100int creatcost(int cost[][max]){    int vexnum,arcnum,i,j,k,v1,v2,w;    printf("\ninput the vexnum and arcnum:");    scanf("%d,%d",&vexnum,&arcnum);    for(i=1;i<=vexnum;i++)    for(j=1;j<=vexnum;j++)    cost[i][j]=9999;    for(k=1;k<=arcnum;k++)    {        printf("v1,v2,w=");        scanf("%d,%d,%d",&v1,&v2,&w);        cost[v1][v2]=w;    }    return vexnum;}void dijkstra(int cost[][max],int vexnum){    int path[max],s[max],dist[max],i,j,w,v,min,v1;    printf("input soure node v1:");    scanf("%d",&v1);    for(i=1;i<=vexnum;i++)    {        dist[i]=cost[v1][i];        s[i]=0;        if(cost[v1][i]<9999)        path[i]=v1;    }    s[v1]=1;    for(i=1;i<=vexnum;i++)    {        min=9999;        for(j=1;j<=vexnum;j++)        if(s[j]==0&&(dist[j])<min)        {            min=dist[j];            w=j;        }        s[w]=1;        for(v=1;v<=vexnum;v++)        if(s[v]==0)        if(dist[w]+cost[w][v]<dist[v])        {            dist[v]=dist[w]+cost[w][v];            path[v]=w;        }    }    printf("the v1 to others:\n");    for(i=2;i<=vexnum;i++)    if(s[i]==1)    {        w=i;        while(w!=v1)        {            printf("%d<--",w);            w=path[w];        }        printf("%d",w);        printf("    %d\n",dist[i]);    }    else    {        printf("%d<--%d",i,v1);        printf("    9999\n");    }}int main(){    int vexnum;    int cost[max][max];    vexnum=creatcost(cost);    dijkstra(cost,vexnum);    return 0;}

运行截图

这里写图片描述

总结

通过对Dijkstra算法的研究发现,判断是其算法的核心,通过标记和判断结合path[]数组的回溯功能,达到路径的判断。此算法是建立在邻接矩阵的基础之上的,看起来还是挺友善的。

原创粉丝点击