• 最短路径问题


    最短路径

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


    版权声明:

  • 相关阅读:
    Mysql常见索引介绍
    Mysql字段修饰符(约束)
    使用select和show命令查看mysql数据库系统信息
    Mysql5.7数据库介绍
    对Mysql数据表本身进行操作
    各种修改Mysql字符集
    Mysql的安全配置向导命令mysql_secure_installation
    firewalld介绍
    CentOS7使用yum安装mysql5.7
    利用ASP.NET一般处理程序动态生成Web图像(转)
  • 原文地址:https://www.cnblogs.com/walccott/p/4956890.html
Copyright © 2020-2023  润新知