关闭

dijstra算法

691人阅读 评论(0) 收藏 举报
分类:

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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:67641次
    • 积分:1443
    • 等级:
    • 排名:千里之外
    • 原创:73篇
    • 转载:22篇
    • 译文:0篇
    • 评论:12条
    最新评论