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算法.zip

  • 2016年04月10日 13:57
  • 4.03MB
  • 下载

dijstra 算法

  • 2012年10月22日 09:15
  • 987KB
  • 下载

hdu2544 最短路 Dijstra算法堆优化,Bellman-Ford,Bellman-Ford队列优化

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...

实现Dijstra算法;

  • 2016年12月15日 18:38
  • 3.43MB
  • 下载

dijstra算法

  • 2017年08月02日 09:39
  • 823KB
  • 下载

C++--图算法之DFS,BFS,Dijstra

list1.h #pragma once #include #define MAXSIZE 20 using namespace std; typedef struct Sidetable ...

dijstra算法

  • 2017年10月31日 16:17
  • 17KB
  • 下载

dijstra 算法

  • 2012年11月22日 10:16
  • 2KB
  • 下载

用Dijstra算法求解2007高教社杯全国大学生数学建模B题

B题:乘公交,看奥运       我国人民翘首企盼的第29届奥运会明年8月将在北京举行,届时有大量观众到现场观看奥运比赛,其中大部分人将会乘坐公共交通工具(简称公交,包括公汽、地铁等)出行。这些年来,...

两种dijstra算法

  • 2014年03月23日 22:14
  • 1.78MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dijstra算法
举报原因:
原因补充:

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