数据结构 图 最短路径

(1)从某个源点到其余各顶点的最短路径

Dijkstra的代码如下:

头文件:

#define  INFINITY 10000
#define  MAX_VERTEX_NUM 20

typedef 
int  InfoType;
typedef 
char  VertexType;
typedef 
int  VRType;

typedef 
enum   {DG, DN, UDG, UDN}  GraphKind;

typedef 
struct  ArcCell {
    VRType adj;
    InfoType 
*info;
}
ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef 
struct {
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    
int vexnum, arcnum;
    GraphKind kind;
}
MGraph;

int  weight[][ 6 =   {
    
{0, INFINITY, 10, INFINITY, 30100},
    
{INFINITY, 05, INFINITY, INFINITY, INFINITY},
    
{INFINITY, INFINITY, 050, INFINITY, INFINITY},
    
{INFINITY, INFINITY, INFINITY, 0, INFINITY, 10},
    
{INFINITY, INFINITY, INFINITY, 20060},
    
{INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 0}
}
;

// #define INPUT 1

源文件:

#include  " graph_dj.h "
#include 
" stdio.h "
#include 
" stdlib.h "

void  createDG(MGraph  & g) {}
void  createDN(MGraph  & g) {}
void  createUDG(MGraph  & g) {}

int  locate(MGraph g,  char  name) {
    
for(int i = 0; i < g.vexnum; i++){
        
if(name == g.vexs[i]){
            
return i;
        }

    }

    
return -1;
}


void  createUDN(MGraph  & g) {
    
#ifdef INPUT
    printf(
"input the number of vertex and arcs: ");
    scanf(
"%d %d"&g.vexnum, &g.arcnum);
    fflush(stdin);
#else
    printf(
"input the number of vertex: ");
    scanf(
"%d"&g.vexnum);
    fflush(stdin);
#endif
    
    
int i = 0, j = 0, k = 0;
    
    printf(
"input the name of vertex: ");

    
for(i = 0; i < g.vexnum; i++){
        scanf(
"%c"&g.vexs[i]);
        fflush(stdin);
    }

    
    
for(i = 0; i < g.vexnum; i++){
        
for(j = 0; j < g.vexnum; j++){
            g.arcs[i][j].adj 
= INFINITY;
            g.arcs[i][j].info 
= NULL;
        }

    }

    
#ifdef INPUT
    
char v1, v2;
    
int w;
    printf(
"input the %d arcs v1 v2 and weight: ", g.arcnum);
    
for(k = 0; k < g.arcnum; k++){
        scanf(
"%c %c %d"&v1, &v2, &w);
        fflush(stdin);
        i 
= locate(g, v1);
        j 
= locate(g, v2);
        g.arcs[i][j].adj 
= w;
    }

#else
    printf(
"now constructing the matrix of graph... ");
    
for(i = 0; i < g.vexnum; i++){
        
for(j = 0; j < g.vexnum; j++){
            g.arcs[i][j].adj 
= weight[i][j];
        }

    }

#endif
}


void  printGraph(MGraph g) {
    
for(int i = 0; i < g.vexnum; i++){
        
for(int j = 0; j < g.vexnum; j++){
            printf(
"%d ", g.arcs[i][j].adj);
        }

        printf(
" ");
    }

}


void  createGragh(MGraph  & g) {
    
    printf(
"please input the type of graph: ");
    scanf(
"%d"&g.kind);
    
    
switch(g.kind){
    
case DG: 
        createDG(g);
        
break;
    
case DN: 
        createDN(g);
        
break;
    
case UDG: 
        createUDG(g);
        
break;
    
case UDN: 
        createUDN(g);
        printGraph(g);
        
break;
    }

}


void  dijkstra(MGraph g) {
    
int *dist = (int *)malloc(sizeof(int* g.vexnum);
    
int *parent = (int *)malloc(sizeof(int* g.vexnum);
    
int *final = (int *)malloc(sizeof(int* g.vexnum);

    
int i, j, k, cost;
    
//init the arrays
    for(i = 0; i < g.vexnum; i++){
        dist[i] 
= g.arcs[0][i].adj;
        parent[i] 
= 0;
        final[i] 
= 0;
    }

    
//join the start 0.
    final[0= 1;
    
    
for(i = 1; i < g.vexnum; i++){
        
//get the min of dist
        cost = INFINITY;
        k 
= -1;
        
for(j = 1; j < g.vexnum; j++){
            
if(dist[j] < cost && final[j] == 0){
                cost 
= dist[j];
                k 
= j;
            }

        }


        
if(k > 0){
            
//join the k node
            final[k] = 1;

            
//update the dist
            for(int t = 1; t < g.vexnum; t++){
                
if(final[t] == 0){
                    
if(dist[t] > dist[k] + g.arcs[k][t].adj){
                        dist[t] 
= dist[k] + g.arcs[k][t].adj;
                        parent[t] 
= k;
                    }

                }

            }

        }

    }


    
//print the dist and parent array
    printf("the shortest path from %c is as follows: ", g.vexs[0]);
    
for(i = 0; i < g.vexnum; i++){
        printf(
"%c via %c's dist is %d "
            g.vexs[i], g.vexs[parent[i]], dist[i]);
    }

}


void  main() {
    MGraph g;
    createGragh(g);
    dijkstra(g);
}

程序的执行结果如下:

please input the type of graph:
3
input the number of vertex:
6
input the name of vertex:
a
b
c
d
e
f
now constructing the matrix of graph...
0         10000     10        10000     30        100
10000     0         5         10000     10000     10000
10000     10000     0         50        10000     10000
10000     10000     10000     0         10000     10
10000     10000     10000     20        0         60
10000     10000     10000     10000     10000     0
the shortest path from a 
is   as  follows:
a via a
' s dist is 0
b via a ' s dist is 10000
c via a ' s dist is 10
d via e ' s dist is 50
e via a ' s dist is 30
f via d ' s dist is 60
Press any key to  continue

说明:Dijkstra算法的复杂度是O(n * n)。

(2)每一对顶点之间的最短路径

方法一:对每个顶点依次运行Dijkstra,复杂度O(n*n*n)。

方法二:floyd,复杂度O(n*n*n)。

头文件修改:

int  weight[][ 3 =   {
    
{0411},
    
{602},
    
{3, INFINITY, 0}
}
;
源文件添加:
void  floyd(MGraph g) {
    
int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
    
int parent[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

    
//init the arrays
    int i, j;
    
for(i = 0; i < g.vexnum; i++){
        
for(j = 0; j < g.vexnum; j++){
            dist[i][j] 
= g.arcs[i][j].adj;
            parent[i][j] 
= i;
        }

    }


    
//compute the shortest path
    for(int k = 0; k < g.vexnum; k++){
        
for(i = 0; i < g.vexnum; i++){
            
for(j = 0; j < g.vexnum; j++){
                
if(i != j && i != k && j != k){
                    
if(dist[i][j] > dist[i][k] + dist[k][j]){
                        dist[i][j] 
= dist[i][k] + dist[k][j];
                        parent[i][j] 
= k;
                    }

                }

            }

        }

    }


    
//print the shortest path and parent
    for(i = 0; i < g.vexnum; i++){
        
for(j = 0; j < g.vexnum; j++){
            printf(
"%d(%c) ", dist[i][j], g.vexs[parent[i][j]]);
        }

        printf(
" ");
    }

}


void  main() {
    MGraph g;
    createGragh(g);
    dijkstra(g);
    floyd(g);
}

程序的运行结果如下:

please input the type of graph:
3
input the number of vertex:
3
input the name of vertex:
a
b
c
now constructing the matrix of graph...
0         4         11
6         0         2
3         10000     0
the shortest path from a 
is   as  follows:
a via a
' s dist is 0
b via a ' s dist is 4
c via b ' s dist is 6
0 (a)     4 (a)     6 (b)
5 (c)     0 (b)     2 (b)
3 (c)     7 (a)     0 (c)
Press any key to 
continue

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值