zoukankan      html  css  js  c++  java
  • Dijkstra算法

    定义

    • 求解单元路径问题

    邻接矩阵 O(V2)

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    //Dijkstra算法
    //邻接矩阵
    const int max_n = 30;
    const int INF = 0x3ffffffff;
    int n,G[max_n][max_n];
    int vis[max_n] = { false };
    int d[max_n];//i s之间的最短距离
    void Dijkstra(int s)
    {
    	//
    	fill(d, d + max_n, INF);
    	d[s] = 0;
    	for (int j = 0; j < n; j++)
    	{
    		int u = -1, min = INF;
    		//找到未访问过的距离s最小的点
    		for (int i = 0; i < n; i++)
    		{
    			if (vis[i] == false && d[u] < min)
    			{
    				min = d[u];
    				u = i;
    			}
    		}
    		if (u == -1)return;
    		vis[u] = true;
    		//更新
    		for (int i = 0; i < n; i++)
    		{
    			if (G[u][i] != INF && d[i] > d[u] + G[u][i] && vis[i] == false)
    			{
    				d[i] = d[u] + G[u][i];
    			}
    		}
    	}
    	
    }
    

    邻接表 O(V2+E)

    #include<stdio.h>
    #include<algorithm>
    #include<vector>
    using namespace std;
    //Dijkstra算法
    //邻接表
    const int max_n = 30;
    const int INF = 0x3ffffffff;
    struct node {
    	int index;
    	int w;
    };
    struct adj {
    	vector<node>nodes;
    }Adj[max_n];
    int vis[max_n] = { false };
    int d[max_n];//i s之间的最短距离
    int n;
    void Dijkstra(int s)
    {
    	fill(d, d + max_n, INF);
    	d[s] = 0;
    	for (int j = 0; j < n; j++)
    	{
    		int u = -1, min = INF;
    		for (int i = 0; i < n; i++)
    		{
    			if (vis[i] == false && d[i] < min)
    			{
    				min = d[i];
    				u = i;
    			}
    		}
    		if (u == -1)return;
    		vis[u] = true;
    		//更新
    		for (int i = 0; i < Adj[u].nodes.size(); i++)
    		{
    			if (vis[Adj[u].nodes[i].index] == false &&
    				d[Adj[u].nodes[i].index] > d[Adj[u].nodes[i].index] + Adj[u].nodes[i].w)
    			{
    				d[Adj[u].nodes[i].index] = d[Adj[u].nodes[i].index] + Adj[u].nodes[i].w;
    			}
    		}
    	}
    	
    	
    }
    

    Dijkstra算法+DFS

    Dijkstra用来求最短路径,用pre保存最短路径。DFS可以根据pre来求解一下权值。

  • 相关阅读:
    jQuery daily
    jQuery daily
    spring事务管理
    AspectJ AOP切面编程(XML配置)
    springAOP思想
    spring与web整合(交鸡肋,因为有前台框架封装了servlet)
    spring复杂对象注入四种方式
    spring的Bean注入和P标签使用
    spring Bean的作用域、生命周期和后处理器
    IoC容器实例化Bean三种方式
  • 原文地址:https://www.cnblogs.com/code-fun/p/15233810.html
Copyright © 2011-2022 走看看