最短路径问题

最短路径

在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短值。

#include "stdafx.h"
#include<deque>
#include<iostream>

using namespace std;
#define N 9
#define MIN 1000000
typedef struct{
	int vexnum, arcnum;
	char vexs[N];
	int matirx[N][N];
}graph;

graph g;


// 初始化图数据    
// 0---1---2---3---4---5---6---7---8---    
// A---B---C---D---E---F---G---H---I---    
void initiate_graph()
{
	// A-B, A-D, A-E  
	g.matirx[0][1] = 10;
	g.matirx[1][0] = 10;
	g.matirx[0][3] = 5;
	g.matirx[3][0] = 5;
	g.matirx[0][4] = 7;
	g.matirx[4][0] = 7;
	// B-C    
	g.matirx[1][2] = 18;
	g.matirx[2][1] = 18;
	// C-F    
	g.matirx[2][5] = 3;
	g.matirx[5][2] = 3;
	// D-E, D-G    
	g.matirx[3][4] = 9;
	g.matirx[4][3] = 9;
	g.matirx[3][6] = 25;
	g.matirx[6][3] = 25;
	// E-F, E-H    
	g.matirx[4][5] = 1;
	g.matirx[5][4] = 1;
	g.matirx[4][7] = 14;
	g.matirx[7][4] = 14;
	// F-H, F-I    
	g.matirx[5][7] = 8;
	g.matirx[7][5] = 8;
	g.matirx[5][8] = 30;
	g.matirx[8][5] = 30;
	// G-H    
	g.matirx[6][7] = 6;
	g.matirx[7][6] = 6;
	// H-I    
	g.matirx[7][8] = 20;
	g.matirx[8][7] = 20;

}

deque<int>find_min_path(int m, int n, graph g)
{
	int a[N] = { 0 };
	deque<deque<int>>aa;
	deque<int>bb, pp, minpath;
	int min = MIN;
	for (int i = 0; i < N; i++)
		if (g.matirx[m][i])
			pp.push_back(i);
	aa.push_back(pp);
	pp.clear();
	bb.push_back(m);
	a[m] = 1;
	bb.push_back(aa[0][0]);
	a[aa[0][0]] = 1;
	aa[0].pop_front();
	while (true)
	{
		while (bb.back() != n)
		{
			for (int i = 0; i < N; i++)
				if (g.matirx[bb.back()][i] && a[i] == 0)
					pp.push_back(i);
			if (pp.empty())
				break;
			bb.push_back(pp.front());
			a[pp.front()] = 1;
			pp.pop_front();
			aa.push_back(pp);
			pp.clear();
		}
		if (bb.back() == n)
		{
			int sum = 0;
			for (int i = 0; i < bb.size()-1; i++)
				sum += g.matirx[bb[i]][bb[i + 1]];
			if (sum < min)
			{
				min = sum;
				minpath = bb;
			}
		}
		a[bb.back()] = 0;
		bb.pop_back();
		while (aa.back().empty())
		{
			
			aa.pop_back();
			a[bb.back()] = 0;
			bb.pop_back();
			if (aa.empty())
				return minpath;
		}
		bb.push_back(aa.back()[0]);
		a[aa.back()[0]] = 1;
		aa.back().pop_front();
	}

}


int _tmain(int argc, _TCHAR* argv[])
{
	initiate_graph();
	deque<int>minpath=find_min_path(0, 8, g);

	system("pause");
	return 0;
}


版权声明:

posted on 2015-08-01 23:55  moffis  阅读(171)  评论(0编辑  收藏  举报

导航