动态规划之多段图(下)

原图如下:

动态规划之多段图(下)_第1张图片

其邻接表表示如下:

动态规划之多段图(下)_第2张图片

代码如下:

// 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;
}

效果如下

动态规划之多段图(下)_第3张图片

这里有两条路线最短:

0-》2-》5-》9-》11

0-》1-》6-》9-》11

你可能感兴趣的:(动态规划之多段图(下))