您的位置:首页 > 其它

动态规划之多段图(下)

2014-04-10 16:52 211 查看
原图如下:



其邻接表表示如下:



代码如下:

// 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: