码迷,mamicode.com
首页 > 其他好文 > 详细

图的单源最短路径:Dijkstra算法实现

时间:2014-05-13 16:49:37      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   c   

本文介绍的是图的非负权值的单源最短路径问题。问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法。

算法核心思想参见维基。简而言之,设集合S存放已经求出了最短路径的点。初始状态S中只有一个点v0,之后每求得v0到vn的最短路径,就会更新v0到所有vn邻接的点的一致的最短路径(不一定是最终的最短路径),如此重复,每次会确定v0到一个点的最短路径,确定好的点加入S中,直至所有点进入S结束。在本文中通过visited这一数组来标记相应点是否已经加入S。

以下是代码实现,供参考。其中图的相关部分参见C++ 图的实现

bubuko.com,布布扣
/*
*单源最短路径:Dijkstra算法
*----By F8Master
*/

#include "Graphmtx.h"
#include<stack>
#include<iostream>
using namespace std;

#define  DEFAULTPRE ‘&‘ //用于标记


template<class T,class E>
void Dijkstra(Graphmtx<T,E> &G, E *dist, T *pre, T &s)//G为存储的图,dist是距离数组,pre是其路径中前一个点,s为源点
{
    int numVertex = G.NumberOfVertices();
    
    bool *visited = new bool[numVertex];//标志有木有确定最小距离

    for (int i =0;i<numVertex;i++)//初始化
    {    
        dist[i] = G.getWeight(G.getVertexPos(s),i);
        if (dist[i]>0 && dist[i]<INF)
            pre[i] = s;
        else 
            pre[i] = DEFAULTPRE;
    }
    pre[G.getVertexPos(s)] = s;
    for(int i =0;i<numVertex;i++)
    {
        visited[i] = false;
    }

    int n= G.getVertexPos(s);
    visited[n] = true;

    for(int i=1;i<numVertex;i++)//每次找一个点,要找numVertex-1次
    {
        E min = INF;
        int u = -1;
        for(int j=0;j<numVertex;j++) //找一个距离最小的点
        {
            if(visited[j]==false && dist[j]<min)
            {
                u = j;
                min = dist[j];        
            }
        }
        if(u > 0)
        {
            visited[u]=true;
            for(int k = 0;k<numVertex;k++)
            {
                if(visited[k]==false && dist[u]+G.getWeight(u,k)<dist[k])
                {
                    dist[k] = dist[u]+G.getWeight(u,k);
                    pre[k] = G.getValue(u);
                    
                }
            }
        }        
    }

}

template<class T,class E >
void showPath(Graphmtx<T,E> &G,T *pre,T &end,T &start)
{
    stack<T> s;
    if(end!=start)
    {
        T v = end;
        while(v!=start)
        {
            s.push(v);
            v = pre[G.getVertexPos(v)];
        }
        s.push(v);
        while(!s.empty())
        {
            cout<<s.top()<<" ";
            s.pop();
        }
    }    
};
//测试代码
void test_Dijkstra()
{
    Graphmtx<char,int> G;//T为char,E为int

    
    G.inputGraph();
    int *dist= new int[G.NumberOfVertices()];
    char *pre = new char[G.NumberOfVertices()];
    char start;
    cout<<"输入源点:";
    cin>>start;
    Dijkstra(G,dist,pre,start);

    for(int i = 0;i<G.NumberOfVertices();i++)
    {
        char end = G.getValue(i);
        if(end!=start)
        {
            showPath(G,pre,end,start);
            cout<<dist[i]<<endl;
        }        
    }
}
bubuko.com,布布扣
对于下图,进行测试:

bubuko.com,布布扣

bubuko.com,布布扣

图的单源最短路径:Dijkstra算法实现,布布扣,bubuko.com

图的单源最短路径:Dijkstra算法实现

标签:style   blog   class   code   java   c   

原文地址:http://www.cnblogs.com/f8master/p/3724523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!