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来求解一下权值。

  • 相关阅读:
    001.云桌面整体解决方案实施
    Netty基础招式——ChannelHandler的最佳实践
    架构设计之数据分片
    Go是一门什么样的语言?
    Jenkins汉化配置
    Window安装构建神器Jenkins
    uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
    如何使用Hugging Face中的datasets
    关于torch.nn.LSTM()的输入和输出
    pytorch中的nn.CrossEntropyLoss()计算原理
  • 原文地址:https://www.cnblogs.com/code-fun/p/15233810.html
Copyright © 2011-2022 走看看