dijstra算法

原创 2013年12月05日 20:13:27

dijstra.h

#ifndef DIJSTRA_H_INCLUDED
#define DIJSTRA_H_INCLUDED
 
#define  MAXVEX   100  /**< 最多顶点数 */
#define  INFINITY    65535/**< 不存在该边是的权值 */
 
struct  graph;
typedef  struct  graph  *Graph;
typedef  int  VertexType;
typedef  int     EdgeType;
typedef  int     PathMatrix[MAXVEX];
typedef  int     ShortPathTable[MAXVEX];
 
 
struct   graph
{
    VertexType   vertex[MAXVEX];
    EdgeType   edge[MAXVEX][MAXVEX];
    int   numvertex,numedge;
};
 
void  CreatGraph(Graph  G);/**< 创建图 */
void  PrintGraph(Graph  G);/**<  将图一临街矩阵的形式打印出来*/
void  Dijstra(Graph  G, int  v0, PathMatrix  P, ShortPathTable  D);
 
#endif // DIJSTRA_H_INCLUDED

dijstra.c

#include  <stdio.h>
#include  <malloc.h>
#include  "dijstra.h"
 
 
void  CreatGraph(Graph  G)
{
    int  i,j,k,w;
 
    printf("input  the  number  of vertex ang  edge:\n");
    printf("the number of  vertex :");
    scanf("%d",&G->numvertex);
    printf("\n");
    printf("the number of edge:");
    scanf("%d",&G->numedge);
 
    /**< 输入顶点 */
    for(i=0;i<G->numvertex;i++)
    {
           printf("输入第%d 顶点:",i+1);
           scanf("%d",&G->vertex[i]);
    }
 
 
    /**< 矩阵初始化 */
    for(i=0;i<G->numvertex;i++)
    {
        for(j=0;j<G->numedge;j++)
        {
            G->edge[i][j] = INFINITY;
        }
    }
 
    /**< 输入边的权值此处一边控制循环次数 */
    for(k=0;k<G->numedge;k++)
    {
        printf("input     vertex  and weight:\n");
        scanf("%d %d %d",&i,&j,&w);
        G->edge[i][j] = w;
        G->edge[j][i] =G->edge[i][j];
 
    }
}
 
void  PrintGraph(Graph  G)
{
    int  i,j;
 
    for(i=0;i<G->numvertex;i++)
    {
        for(j=0;j<G->numvertex;j++)
        {
            if(G->edge[i][j] == INFINITY)
                printf("\t**");
            else
                printf("\t%d",G->edge[i][j]);
        }
        printf("\n");
    }
}
 
/** \brief 最短路径算法
 *图、起点以及两个辅助数组
 * \param pathmatrix表示路径(该点之前的一个点)
 * \param Shortpathtable表示道该点的路径长
 * \return 无返回值
 *作者:曼珠沙华 2013年10月
 */
 
void  Dijstra(Graph  G, int  v0, PathMatrix  P, ShortPathTable  D)
{
    int  v, w, k, min;
    int   final[MAXVEX];     /**< 标志数组如值为1表示已找到该点的最小路径 */
 
    /**< 初始化数组值 */
    for(v=0; v < G->numvertex; v++)
    {
        final[v] =0;             /**< 全部为未找到 */
        D[v] = G->edge[v0][v];   /**< 初始化为第一行的权值,同Prime算法 */
        P[v] = 0;                 /**< 前驱均为0 */
    }
 
    D[v0] = 0;
    final[v0] = 1;           /**< 表示v0已找到 */
 
 
    for(v=1; v < G->numvertex; v++)
    {
        min = INFINITY;
        for(w=0; w < G->numvertex; w++)
        {
            if(!final[w]  && D[w] < min)       /**< 开始比较D[w]的值  如较小则改为当前值 */
            {
                k=w;                                         /**< 较小值得相应点  同prime算法 */
                min=D[w];
            }
        }
 
        final[k] = 1;                        /**< 表示该点最小路径已找到 */
 
        /** \brief 关键循环保证所找路径为最小
         *  在已找到最短路径(v0,vk)的基础上再次比较找到下一个更短的权值
         * \param将k改为下一个点点最小权值的前驱
         * \param
         * \return
         *
         */
 
        for(w=0; w < G->numvertex; w++)
        {
            if(!final[w] && min + G->edge[k][w] < D[w])
            {
                D[w] =min +G->edge[k][w];
                P[w] =k;
            }
        }
    }
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include  "dijstra.c"
 
int main()
{
    int v0,i;
    i=v0=0;
    PathMatrix  P;
    ShortPathTable  D;
    Graph  G;
    G=(Graph)malloc(sizeof(struct  graph));
 
 
    CreatGraph(G);
    PrintGraph(G);
    Dijstra(G, v0, P,D);
 
    printf("\n源点到各顶点的最短路径长度为:\n");
    for(i=1;i<G->numvertex;++i)
        printf("v%d - v%d : %d \n",G->vertex[0],G->vertex[i],D[i]);
 
    return 0;
}


Dijstra算法 C++实现

Dijstra算法思想,简化版实现,:从源节点开始调整,相邻节点的最短距离。调整完之后,从距离最短并且没有作为u的节点中选取下一个节点 ,调整后面的节点,时间复杂度O(V*(V+E))。 #incl...
  • a2796749
  • a2796749
  • 2015年09月09日 16:23
  • 785

dijstra算法 c语言实现

看来群的作用真的很大啊 刚才为了一下,发现自己的抽象思维能力简直为0 总以为没有办法处理集合,然后群里面的人说可以用bool 数组,然后研究了一下,果然可以 算法描述的时候说集合的并啊,减啊,在...
  • linxinyuluo
  • linxinyuluo
  • 2011年10月08日 14:57
  • 2402

单源最短路径Dijstra算法

Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径。Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的。设v0是源顶点,我们要寻找从v0出发到其他任意...
  • Tander_Tang
  • Tander_Tang
  • 2016年03月30日 23:00
  • 732

Dijstra算法代码描述

图论学过很多次的最短路问题,其中Dijstra算法是一个经典的解决求图中某一点到其他所有点的算法,思想理解了很多遍,但是不知道代码怎么写! 如果要理解算法的话网上很多博客都有讲的,这里把代码和运行过...
  • ACMLCER
  • ACMLCER
  • 2016年07月20日 15:35
  • 782

Dijstra算法的代码实现及解释(最短路径问题)

/*Dijstra 算法 实践 begin date:2015.3.19 end date:2015.3.19*/ #include using namespace std; const int m...
  • qq_21567903
  • qq_21567903
  • 2015年03月19日 20:57
  • 196

简单实现dijstra算法和floyd算法并打印所有最短路径

#include #include #include #include #include #include #include using namespace std; typede...
  • wocaoqwerty
  • wocaoqwerty
  • 2014年09月12日 18:05
  • 272

双向Dijstra算法

双向Dijstra算法:在无向带权图中,求从s到t最短路径。双向Dijstra算法的思想是:分别从s顶点和t顶点开始执行单向Dijstra算法,从s点开始执行的Dijstra算法定义为前向Dijstr...
  • yang20141109
  • yang20141109
  • 2015年12月17日 16:30
  • 360

Prim算法和Kruskal算法理解

一:Prim算法 Prim算法的实现就是通过搜索来实现的,首先找一个起始点a,然后找与起始点相关联的所有的点中离a最近的点b,并且把这个点融入最小生成树中,然后再比较与b相关联的点和与a相关联的点的...
  • qq_40843412
  • qq_40843412
  • 2018年01月29日 20:24
  • 12

最短路径--Dijstra算法

最短路径 题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最...
  • itismelzp
  • itismelzp
  • 2015年10月30日 21:58
  • 664

图论(5)-Dijstra算法

Floyd算法时间复杂度为O(N^3),所以在大部分机试题时间允许范围内,它要求解图的大小不大于200个结点,若超过可能因为效率不高而被判超时,Floyd算法完成后。图中所以结点之间的最短路径都可以被...
  • qq_34552886
  • qq_34552886
  • 2017年03月07日 10:22
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dijstra算法
举报原因:
原因补充:

(最多只允许输入30个字)