边上值非负的单源最短路径问题----Dijkstra算法

问题提出:给定一个带权的有向图(即有向网)G和源点v0,求v0到G中其他每个顶点的最短路径。限定各边上的权值大于0.

算法实现:按路径长度递增的顺序,逐步产生最短路径的算法,即首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v0到其他各顶点的最短路径全部求出为止。


dijkstra具体实现方法如下:


1.设置两个顶点的集合T和S。

(1).S中存放已经找到的最短路径的顶点,初始时,集合S中只有一个顶点,即源点v0.

(2)T中存放当前还未找到最短路径的顶点。

2.在集合T中选取当前长度最短的一条路径(v0,。。vk),从而将vk加入到顶点集合S中,并修改v0到T中个顶点的最短路径长度;重复这一步骤,直到所有的顶点都加入到集合S中,算法结束。

例题一(有向图的最短路径问题):求顶点0到其他各顶点的最短路径长度,并输出相应的最短路径。

#include
#include
#include
using namespace std;
#define maxint 0x3f3f3f3f
int n;
int map[110][110],visited[110],dist[110],path[110];
void dijkstra(int v0);
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(map,maxint,sizeof(map));
        int u,v,w;
        while(1)
        {
            scanf("%d%d%d",&u,&v,&w);
            if(u==-1&&v==-1&&w==-1) break;///无法确定输入数据的组数
            map[u][v]=w;
        }
        for(int i=0;i0;j--)
                printf("%d-",shortest[j]);
             printf("%d\n",shortest[0]);
         }
         return 0;
    }
    return 0;
}
void dijkstra(int v0)
{
    int i,j,min,pos;
    memset(visited,0,sizeof(visited));
    visited[v0]=1;
    pos=v0;
    dist[v0]=0;
    for(i=0;i
边上值非负的单源最短路径问题----Dijkstra算法_第1张图片


输出结果如上图所示;

例题2(无项图的算法)原题POJ2387

#include
#include
#include
#define maxint 0x3f3f3f3f
using namespace std;
 void dijkstra(int v0);
int visited[1100],dist[1100],map[1100][1100];
int n;
int main()
{
    int m;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(map,maxint,sizeof(map));
        int u,v,w;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            if(w




你可能感兴趣的:(图论)