原图如下:
其邻接表表示如下:
代码如下:
// duoduantu.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdlib.h> #define MAX_VERTEX_NUM 20 #define MAX_VALUE_TYPE INT_MAX typedef int VertexType; typedef struct node{ VertexType adjvex; //邻接点域 int weight; struct node* next; //指向下一个邻接点的指针域 }EdgeNode; //边表节点 typedef struct vnode{ VertexType vertex; //顶点域 EdgeNode *firstedge; //边表头指针 }VertexNode; //表头节点 typedef VertexNode adjList[MAX_VERTEX_NUM]; typedef struct{ adjList adjlist; //邻接表 int n,e; //node and edge }ALGraph; void CreateALGraph(ALGraph *G) { int i, j; int k; EdgeNode *s; scanf("%d%d", &G->n, &G->e); for (i = 0; i <G->n; i++) { scanf("%d", &G->adjlist[i].vertex); G->adjlist[i].firstedge = NULL;//边表设置成空表 } for (k = 0; k < G->e; k++) { int nwight = 0; scanf("%d%d", &i, &j);//i = Locate(G, i); j = Locate(G, j); //查找结点序号 s = (EdgeNode *)malloc(sizeof(EdgeNode)); /*scanf("%d", &s->weight);*/ scanf("%d", &nwight); s->weight = nwight; s->adjvex = j;//邻接点序号为j s->next = G->adjlist[i].firstedge; G->adjlist[i].firstedge = s; /*s = (EdgeNode *)malloc(sizeof(EdgeNode)); s->adjvex = i; s->weight = nwight; s->next = G->adjlist[j].firstedge; G->adjlist[j].firstedge = s;*/ } } VertexType fgraph(ALGraph *G, int route[], int n) //n顶点的个数 { int i; EdgeNode *pnode; int *path = (int *)malloc(n*sizeof(int)); VertexType min_cost; VertexType *cost = (VertexType*)malloc(n*sizeof(VertexType)); for(i=0; i<n; i++) { cost[i] = MAX_VALUE_TYPE; path[i] = -1; route[i] = 0; } cost[n-1] = 0; for(i=n-1; i>=0; i--) { pnode = G->adjlist[i].firstedge; while(pnode != NULL) { if(pnode->weight + cost[pnode->adjvex] < cost[i]) { cost[i] = pnode->weight + cost[pnode->adjvex]; path[i] = pnode->adjvex; } pnode = pnode->next; } } i = 0; /*for(i=0; i<n; i++) { printf("%d\n", route[i]); } printf("........\n"); for(i=0; i<n; i++) { printf("%d\n", cost[i]); } printf("........\n"); for(i=0; i<n; i++) { printf("%d\n", path[i]); }*/ while((route[i] != n-1 ) && ( path[i] != -1 )) { i++; route[i] = path[route[i-1]]; } for(i=0; i<n; i++) { printf("%d\n", route[i]); } min_cost = cost[0]; free(path); free(cost); return min_cost; } void print(ALGraph *G) { EdgeNode *p; int i; for(i=0; i<G->n; i++) { printf("index %d VERTEX %d", i, G->adjlist[i].vertex); for(p = G->adjlist[i].firstedge; p ; p = p->next) { printf("->\tVERTEX %d weight %d", p->adjvex, p->weight); } putchar('\n'); } } int _tmain(int argc, _TCHAR* argv[]) { freopen("my.txt", "r", stdin); int route[MAX_VERTEX_NUM]; ALGraph G; CreateALGraph(&G); print(&G); printf("%d", fgraph(&G, route, G.n)); int i; for(i=0; i<G.n; i++) { printf("\t%d", route[i]); } return 0; }
这里有两条路线最短:
0-》2-》5-》9-》11
0-》1-》6-》9-》11