单源最短路径之dijkstra算法

来源:互联网 发布:java web静态资源分离 编辑:程序博客网 时间:2024/05/16 04:34

概念:该算法常用于路由算法或者作为其他图算法的一个子模块。常常用来计算一个图中某点到其他点的最短路径:例如该题:ccf2016094交通规划

算法思想:以起始点为中心,向外层层扩散。
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
(见算法导论翻译版第三版383页)

例如该图的单源最短路径
这里写图片描述

对应代码:

#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=105;const int maxnum=10000;int arr[maxn][maxn];//存放点和点间权值bool v[maxn];int path[maxn];//存放访问点的记录int dist[maxn];//存放点路径int node,edge;int dijkstra(int s){    int i,j;    memset(v,false,sizeof(v));    v[s]=true;    for(i=0;i<node;i++)//更新dist数组    {        dist[i]=arr[s][i];        path[i]=s;    }    int minnum;//最小值     int minindex;//最小值下标        for(i=0;i<node;i++)    {        if(i==s) continue;        minnum=maxnum;        for(j=0;j<node;j++)        {            if(dist[j]<minnum&&v[j]==false)            {                minnum=dist[j];                minindex=j;//找到了下一条权值最小的点            }        }        v[minindex]=true;        for(j=0;j<node;j++)//更新dist数组        {            if(v[j]==false&&arr[minindex][j]!=maxnum&&arr[minindex][j]+minnum<dist[j])            {                dist[j]=arr[minindex][j]+minnum;                path[j]=minindex;            }        }    }}int main(){    int i,j,s,start,end,value;    scanf("%d %d",&node,&edge);    for(i=0;i<node;i++)//初始化数组值    {        for(j=0;j<node;j++)        {            arr[i][j]=maxnum;            if(i==j)                arr[i][j]=0;        }    }    printf("输入两点以及权值边:\n");    for(i=0;i<edge;i++)//赋值    {        scanf("%d %d %d",&start,&end,&value);        arr[start][end]=value;        arr[end][start]=value;    }            //scanf("%d",arr[i][j]);    printf("输入源点:\n");    scanf("%d",&s);    dijkstra(s);    for(i=0;i<node;i++)//测试点访问路径        printf("%d ",dist[i]);    return 0;}
原创粉丝点击