zoukankan      html  css  js  c++  java
  • 最短路径问题

    最短路径

    在无向图 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;
    }
    


    版权声明:

  • 相关阅读:
    Sea Battle<海战>(思路题)
    Hat's Fibonacci hdu 1250
    Nearest Neighbor Search
    Divisible by Seven CodeForces
    手机自动化测试:appium源码分析之bootstrap六
    手机自动化测试:appium源码分析之bootstrap五
    手机自动化测试:appium源码分析之bootstrap四
    手机自动化测试:appium源码分析之bootstrap三
    手机自动化测试:appium源码分析之bootstrap二
    手机自动化测试:appium源码分析之bootstrap一
  • 原文地址:https://www.cnblogs.com/walccott/p/4956890.html
Copyright © 2011-2022 走看看