动态规划之多段图(下)
2014-04-10 16:52
211 查看
原图如下:
![](http://img.blog.csdn.net/20140410164755203)
其邻接表表示如下:
![](http://img.blog.csdn.net/20140410164833312)
代码如下:
效果如下
![](http://img.blog.csdn.net/20140410165051468)
这里有两条路线最短:
0-》2-》5-》9-》11
0-》1-》6-》9-》11
其邻接表表示如下:
代码如下:
// 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
相关文章推荐
- c#学习笔记之阶乘遇到问题
- ios KVC机制的使用
- winpcap局域网抓包工具http
- MongoDB中级---->关联多表查询
- CSS3学习之分享下transition属性
- linux 下安装mysql (ubuntu 12.04)
- MongoDB中级---->关联多表查询
- 版本号-版本管理简析
- linux MP3播放器的移植
- PHP
- Hadoop API 使用介绍
- 如何使用唯物主义辩证法
- 这里是dom操作的问题 , 需要记录下来 ,之后参考使用
- (键盘)代码 19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备
- Eclipse中如何修改SVN的地址
- Apache2.4安装指南
- Eclipse的team下的 SVN update to HEAD 和 Synchronize with repository 的区别
- [物理学与PDEs]第2章第1节 理想流体力学方程组 1.3 理想流体力学方程组的数学结构
- 要坚持从难从严训练,保持高度戒备
- 需要抽空学习的