迪杰斯特拉算法求最短路径
来源:互联网 发布:淘宝哪家水货手机好 编辑:程序博客网 时间:2024/05/01 17:53
- #include <stdio.h>
- #define INFINITY 10000
- #define TRUE 1
- #define FALSE 0
- #define VERTEX_NUM 6
- typedef struct Graph
- {
- char vexs[VERTEX_NUM];
- int arcs[VERTEX_NUM][VERTEX_NUM];
- int vexnum;
- int arcnum;
- }Graph;
- void ShortestPath(Graph g,int v0,int p[][VERTEX_NUM],int d[])
- {
- int v;
- int w;
- int min;
- int i,j;
- int final[VERTEX_NUM];
-
-
- for (v = 0; v < g.vexnum; v++)
- {
- final[v] = FALSE;
- d[v] = g.arcs[v0][v];
- for (w = 0; w < g.vexnum; w++)
- {
- p[v][w] = -1;
- }
- if (d[v] < INFINITY)
- {
- p[v][v0] = v;
- }
- }
-
- d[v0] = 0;
- final[v0] = TRUE;
-
- for (i = 1; i < g.vexnum; i++)
- {
- min=INFINITY;
- for (w = 0; w<g.vexnum; w++)
- {
- if (!final[w])
- {
- if (d[w] < min)
- {
-
- v=w;
- min=d[w];
- }
- }
- }
- final[v] = TRUE;
- for (w = 0; w<g.vexnum; w++)
- {
- if (!final[w] && (min+g.arcs[v][w] < d[w]) )
- {
-
- d[w] = min + g.arcs[v][w];
- for (j = 0; j < VERTEX_NUM; j++)
- {
- p[w][j] = p[v][j];
- }
- p[w][v] = w;
- }
- }
- }
- }
- void main()
- {
- int i,
- j;
- Graph g;
- int p[VERTEX_NUM][VERTEX_NUM];
- int d[VERTEX_NUM];
- int v0;
-
- g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C',g.vexs[3]='D',g.vexs[4]='E',g.vexs[5]='F';
- for(i=0;i<VERTEX_NUM;i++)
- for(j=0;j<VERTEX_NUM;j++)
- g.arcs[i][j]=INFINITY;
- g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
- g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
- g.vexnum=g.arcnum=VERTEX_NUM;
-
- for(i=0;i<VERTEX_NUM;i++)
- {
- printf("%c/t",g.vexs[i]);
- for(j=0;j<VERTEX_NUM;j++)
- {
- printf("%5d ",g.arcs[i][j]);
- }
- printf("/n");
- }
- printf("/n");
-
- v0 = 0;
- ShortestPath(g,v0,p,d);
-
- for (i = 0; i < g.vexnum; i++)
- {
- printf("Path %c to %c:/n",g.vexs[v0],g.vexs[i]);
- if ( p[i][v0] != -1 )
- {
- for (j = v0; j != -1; j = p[i][j])
- {
- if (j != v0)
- printf("→");
- printf("%c",g.vexs[j]);
- }
- printf("/n");
- }
- printf("Length:%d/n",d[i]);
- printf("/n");
- }
- }