• Dijkstra算法求最短路径


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <limits.h>
      5 
      6 #pragma warning(disable:4996)
      7 
      8 #define MAX_NAME 10
      9 #define MAX_VERTEX_NUM 26
     10 
     11 typedef char VertexType[MAX_NAME];
     12 typedef unsigned int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接距阵
     13 
     14 struct MGraph//定义网
     15 {
     16     VertexType vexs[MAX_VERTEX_NUM];
     17     AdjMatrix arcs;
     18     int vexnum, arcnum;
     19 };
     20 
     21 int LocateVex( MGraph& G, VertexType u ) //定位
     22 {
     23     register int i;
     24 
     25     for ( i = 0; i < G.vexnum; ++ i )
     26     {
     27         if ( strcmp( u, G.vexs[i] ) == 0 )
     28         {
     29             return i;
     30         }
     31     }
     32     return -1;
     33 }
     34 
     35 void CreateDN( MGraph& G ) //建网
     36 {
     37     int i, j, k, w;
     38     VertexType va, vb;
     39 
     40     printf( "请输入有向网G的顶点数和弧数(以空格作为间隔)
    " );
     41     scanf( "%d %d", &G.vexnum, &G.arcnum );
     42 
     43     memset( G.vexs, 0, sizeof( G.vexs ) );
     44     printf( "请输入%d个顶点的值(<%d个字符):
    ", G.vexnum, MAX_NAME );
     45     for ( i = 0; i < G.vexnum; ++ i )
     46     {
     47         scanf( "%s", G.vexs[i] );
     48     }
     49 
     50     memset( G.arcs, 0xff, sizeof( G.arcs ) );
     51     printf( "请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): 
    ", G.arcnum );
     52     for ( k = 0; k < G.arcnum; ++ k )
     53     {
     54         scanf( "%s%s%d%*c", va, vb, &w );
     55         i = LocateVex( G, va );
     56         j = LocateVex( G, vb );
     57         G.arcs[i][j] = w;
     58     }
     59 }
     60 
     61 typedef unsigned int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
     62 typedef unsigned int ShortPathTable[MAX_VERTEX_NUM];
     63 
     64 void ShortestPath_DIJ( MGraph& G, int v0, PathMatrix P, ShortPathTable D )
     65 {
     66     int v, w, i;
     67     unsigned int min;
     68     unsigned int final[MAX_VERTEX_NUM];
     69 
     70     for ( v = 0; v < G.vexnum; ++ v )
     71     {
     72         final[v] = 0;
     73         D[v] = G.arcs[v0][v];
     74 
     75         memset( P[v], 0, sizeof( int ) * G.vexnum );
     76 
     77         if ( D[v] < UINT_MAX )
     78         {
     79             P[v][v0] = P[v][v] = 1;
     80         }
     81     }
     82 
     83     D[v0] = 0;
     84     final[v0] = 1;
     85     for ( i = 1; i < G.vexnum; ++ i )
     86     {
     87         min = UINT_MAX;
     88         for ( w = 0; w < G.vexnum; ++ w )
     89         {
     90             if ( !final[w] && D[w] < min )
     91             {
     92                 v = w;
     93                 min = D[w];
     94             }
     95         }
     96 
     97         final[v] = 1;
     98 
     99         for ( w = 0; w < G.vexnum; ++ w )
    100         {
    101             if ( !final[w] && min < UINT_MAX && G.arcs[v][w] < UINT_MAX && ( min + G.arcs[v][w] < D[w] ) )
    102             {
    103                 D[w] = min + G.arcs[v][w];
    104                 memcpy( P[w], P[v], sizeof( int ) * G.vexnum );
    105                 P[w][w] = 1;
    106             }
    107         }
    108     }
    109 }
    110 
    111 int main()
    112 {
    113     int i, j;
    114     MGraph g;
    115     PathMatrix p;
    116     ShortPathTable d;
    117 
    118     CreateDN( g );
    119 
    120     ShortestPath_DIJ( g, 0, p, d ); //以g中位置为0的顶点为源点,球其到其余各顶点的最短距离。存于d中
    121 
    122     printf( "最短路径数组p[i][j]如下:
    " );
    123     for ( i = 0; i < g.vexnum; ++ i )
    124     {
    125         for ( j = 0; j < g.vexnum; ++ j )
    126         {
    127             printf( "%2d", p[i][j] );
    128         }
    129         printf( "
    " );
    130     }
    131 
    132     printf( "%s到各顶点的最短路径长度为:
    ", g.vexs[0] );
    133     for ( i = 1; i < g.vexnum; ++i )
    134     {
    135         if ( d[i] != UINT_MAX )
    136         {
    137             printf( "%s-%s:%d
    ", g.vexs[0], g.vexs[i], d[i] );
    138         }
    139         else
    140         {
    141             printf( "%s-%s:无路
    ", g.vexs[0], g.vexs[i] );
    142         }
    143     }
    144 
    145     system( "PAUSE" );
    146     return 0;
    147 }

    /*
    请输入有向网G的顶点数和弧数(以空格作为间隔)
    6 8
    请输入6个顶点的值(<10个字符):
    v1
    v2
    v3
    v4
    v5
    v6
    请输入8条弧的弧尾 弧头 权值(以空格作为间隔):
    v1 v3 10
    v1 v5 30
    v1 v6 100
    v2 v3 5
    v3 v4 50
    v4 v6 10
    v5 v4 20
    v5 v6 60
    最短路径数组p[i][j]如下:
     0 0 0 0 0 0
     0 0 0 0 0 0
     1 0 1 0 0 0
     1 0 0 1 1 0
     1 0 0 0 1 0
     1 0 0 1 1 1
    v1到各顶点的最短路径长度为:
    v1-v2:无路
    v1-v3:10
    v1-v4:50
    v1-v5:30
    v1-v6:60
    请按任意键继续. . .
    */

  • 相关阅读:
    IE兼容只读模式
    关于css实现单行、多行省略标记
    table表格字母无法换行
    IE浏览器兼容background-size
    IE兼容rgba()透明度
    修改输入框placeholder的默认样式
    Swarm+Docker+Portainer(集群,图形化)
    Docker的centos镜像内无法使用systemctl命令的解决办法
    Docker 制作Nginx镜像
    Xtrabackup 全量备份脚本
  • 原文地址:https://www.cnblogs.com/javado/p/3159617.html
Copyright © 2020-2023  润新知