国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

這篇具有很好參考價(jià)值的文章主要介紹了二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

算法模板

二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表

Dijkstra題目代碼模板

樸素dijkstra算法

對(duì)應(yīng)模板題:Dijkstra求最短路 I
時(shí)間復(fù)雜是 O(n^2+m):n 表示點(diǎn)數(shù),m 表示邊數(shù)
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表

int g[N][N];  // 存儲(chǔ)每條邊
int dist[N];  // 存儲(chǔ)1號(hào)點(diǎn)到每個(gè)點(diǎn)的最短距離
bool st[N];   // 存儲(chǔ)每個(gè)點(diǎn)的最短路是否已經(jīng)確定

// 求1號(hào)點(diǎn)到n號(hào)點(diǎn)的最短路,如果不存在則返回-1
int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    for (int i = 0; i < n - 1; i ++ )
    {
        int t = -1;     // 在還未確定最短路的點(diǎn)中,尋找距離最小的點(diǎn)
        for (int j = 1; j <= n; j ++ )
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;

        // 用t更新其他點(diǎn)的距離
        for (int j = 1; j <= n; j ++ )
            dist[j] = min(dist[j], dist[t] + g[t][j]);

        st[t] = true;
    }

    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}

堆優(yōu)化版dijkstra

對(duì)應(yīng)模板題:Dijkstra求最短路 II
時(shí)間復(fù)雜度 O(mlogn):n 表示點(diǎn)數(shù),m 表示邊數(shù)
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表

typedef pair<int, int> PII;

int n;      // 點(diǎn)的數(shù)量
int h[N], w[N], e[N], ne[N], idx;       // 鄰接表存儲(chǔ)所有邊
int dist[N];        // 存儲(chǔ)所有點(diǎn)到1號(hào)點(diǎn)的距離
bool st[N];     // 存儲(chǔ)每個(gè)點(diǎn)的最短距離是否已確定

// 求1號(hào)點(diǎn)到n號(hào)點(diǎn)的最短距離,如果不存在,則返回-1
int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});      // first存儲(chǔ)距離,second存儲(chǔ)節(jié)點(diǎn)編號(hào)

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > distance + w[i])
            {
                dist[j] = distance + w[i];
                heap.push({dist[j], j});
            }
        }
    }

    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}

樹(shù)與圖的存儲(chǔ)

樹(shù)是一種特殊的圖,與圖的存儲(chǔ)方式相同。
對(duì)于無(wú)向圖中的邊ab,存儲(chǔ)兩條有向邊a->b, b->a。
因此我們可以只考慮有向圖的存儲(chǔ)。

(1) 鄰接矩陣:

g[a][b] 存儲(chǔ)邊a->b

(2) 鄰接表:

https://www.acwing.com/video/21/
(1:20:00左右)

// 對(duì)于每個(gè)點(diǎn)k,開(kāi)一個(gè)單鏈表,存儲(chǔ)k所有可以走到的點(diǎn)。h[k]存儲(chǔ)這個(gè)單鏈表的頭結(jié)點(diǎn)
int h[N], e[N], ne[N], idx;

// 添加一條邊a->b
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

int main(){
	...
	// 初始化
	idx = 0;
	memset(h, -1, sizeof h);
	...
}

有權(quán)重時(shí)模板:

int h[N],w[N],e[N],ne[N],idx; 

void add(int a,int b,int c){
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

關(guān)于e[],ne[],h[]的理解

二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
h[N] : 表示 第 i 個(gè)節(jié)點(diǎn)的 第一條邊的 idx
ne[M] : 表示 與 第 idx 條邊 同起點(diǎn) 的 下一條邊 的 idx
e[M] : 表示 第idx 條邊的 終點(diǎn)

N : 節(jié)點(diǎn)數(shù)量
M:邊的數(shù)量
i : 節(jié)點(diǎn)的下標(biāo)索引
idx : 邊的下標(biāo)索引
變量初始化定義:

int h[N], e[M], ne[M], idx;

當(dāng)我們加入一條邊的時(shí)候:

void add(int a,int b){
     e[idx] = b;      // 記錄 加入的邊 的終點(diǎn)節(jié)點(diǎn)
     ne[idx] = h[a]; // h[a] 表示 節(jié)點(diǎn) a 為起點(diǎn)的第一條邊的下標(biāo),ne[idx] = h[a] 表示把 h[a] 這條邊接在了 idx 這條邊的后面,其實(shí)也就是把 a 節(jié)點(diǎn)的整條鏈表 接在了 idx 這條邊 后面;目的就是為了下一步 把 idx 這條邊 當(dāng)成 a 節(jié)點(diǎn)的單鏈表的 第一條邊,完成把最新的一條邊插入到 鏈表頭的操作;
     h[a] = idx++; // a節(jié)點(diǎn)開(kāi)頭的第一條邊置為當(dāng)前邊,idx移動(dòng)到下一條邊
}

要注意的是鄰接表插入新節(jié)點(diǎn)時(shí)使用的是“頭插”,如圖中節(jié)點(diǎn)2:當(dāng)插入2 1時(shí)此時(shí)為2—>1, 而后插入2 4后,此時(shí)為 2—> 4 —> 1.
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表

關(guān)于堆的原理與操作

二、數(shù)據(jù)結(jié)構(gòu)10:堆 模板題+算法模板(堆排序,模擬堆)

模板題

Dijkstra求最短路 I

原題鏈接

https://www.acwing.com/problem/content/851/

題目

給定一個(gè) n
個(gè)點(diǎn) m
條邊的有向圖,圖中可能存在重邊和自環(huán),所有邊權(quán)均為正值。

請(qǐng)你求出 1
號(hào)點(diǎn)到 n
號(hào)點(diǎn)的最短距離,如果無(wú)法從 1
號(hào)點(diǎn)走到 n
號(hào)點(diǎn),則輸出 ?1
。

輸入格式
第一行包含整數(shù) n
和 m

接下來(lái) m
行每行包含三個(gè)整數(shù) x,y,z
,表示存在一條從點(diǎn) x
到點(diǎn) y
的有向邊,邊長(zhǎng)為 z

輸出格式
輸出一個(gè)整數(shù),表示 1
號(hào)點(diǎn)到 n
號(hào)點(diǎn)的最短距離。

如果路徑不存在,則輸出 ?1
。

數(shù)據(jù)范圍
1≤n≤500
,
1≤m≤105
,
圖中涉及邊長(zhǎng)均不超過(guò)10000。

輸入樣例:

3 3
1 2 2
2 3 1
1 3 4

輸出樣例:

3

思路

二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表

題解

#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
const int M = 1e5 + 10;
int dist[N]; // 存各點(diǎn)與1號(hào)點(diǎn)的最短距離 
bool st[N]; // 存各點(diǎn)是否已被 處理為最短距離點(diǎn) 判斷 (當(dāng)前已確定最短距離的點(diǎn)) 
int g[N][N];
int n,m,t;

int dijkstra(){

	memset(dist,0x3f,sizeof dist);
	dist[1] = 0;
	for(int i = 0;i<n;i++){
		t = -1; //	t: 不在 當(dāng)前已確定最短距離的點(diǎn) 中的距離最短的點(diǎn) 初始化為-1 
		for(int j = 1;j<=n;j++){
			if(!st[j] && (t == -1 || dist[t] > dist[j])){
				t = j;
			}
		}
		
		st[t] = true;
		for(int j=1;j<=n;j++){
			dist[j] = min(dist[j],dist[t] + g[t][j]); //用(1到t+t到j(luò))的長(zhǎng)度與(1到j(luò))的長(zhǎng)度進(jìn)行對(duì)比更新 
		}
		
	}
	if(dist[n] == 0x3f3f3f3f) return -1;
	else return dist[n];
}
int main(){
	cin>>n>>m;
	memset(g,0x3f,sizeof g);
	for(int i=0;i<m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		g[x][y] = min(g[x][y],z);
		
	}	
	
	int res = dijkstra();
	
	printf("%d",res);
	
	return 0;
	
	
}

Dijkstra求最短路 II

原題鏈接

https://www.acwing.com/problem/content/852/

題目

給定一個(gè) n
個(gè)點(diǎn) m
條邊的有向圖,圖中可能存在重邊和自環(huán),所有邊權(quán)均為非負(fù)值。

請(qǐng)你求出 1
號(hào)點(diǎn)到 n
號(hào)點(diǎn)的最短距離,如果無(wú)法從 1
號(hào)點(diǎn)走到 n
號(hào)點(diǎn),則輸出 ?1
。

輸入格式
第一行包含整數(shù) n
和 m

接下來(lái) m
行每行包含三個(gè)整數(shù) x,y,z
,表示存在一條從點(diǎn) x
到點(diǎn) y
的有向邊,邊長(zhǎng)為 z
。

輸出格式
輸出一個(gè)整數(shù),表示 1
號(hào)點(diǎn)到 n
號(hào)點(diǎn)的最短距離。

如果路徑不存在,則輸出 ?1

數(shù)據(jù)范圍
1≤n,m≤1.5×105
,
圖中涉及邊長(zhǎng)均不小于 0
,且不超過(guò) 10000
。
數(shù)據(jù)保證:如果最短路存在,則最短路的長(zhǎng)度不超過(guò) 109
。

輸入樣例:

3 3
1 2 2
2 3 1
1 3 4

輸出樣例:

3

思路

使用堆優(yōu)化,選擇用stl中的priority_queue進(jìn)行操作
二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency),算法與數(shù)據(jù)結(jié)構(gòu)模板,圖論,算法,數(shù)據(jù)結(jié)構(gòu),c++,鏈表
關(guān)于st[N]數(shù)組 處理冗余部分
https://www.acwing.com/solution/content/167860/

題解

#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int M = 2e5 + 10;
typedef pair<int,int> PII;
int dist[N]; // 存各點(diǎn)與1號(hào)點(diǎn)的最短距離 
bool st[N]; // 存各點(diǎn)是否已被 處理為最短距離點(diǎn) 判斷 (當(dāng)前已確定最短距離的點(diǎn)) 
//int g[N][N];
//堆優(yōu)化中,由于為稀疏圖,因此使用鄰接表進(jìn)行存儲(chǔ)
int h[N],w[N],e[N],ne[N],idx; 

int n,m,t;

//鄰接表插入處理 
void add(int a,int b,int c){
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

int dijkstra(){

	memset(dist,0x3f,sizeof dist);
	dist[1] = 0;
	
//	堆優(yōu)化版dijkstra
	priority_queue<PII,vector<PII>,greater<PII>> heap;
	heap.push({0,1}); // {距離,編號(hào)}編號(hào)為1的點(diǎn)距離為0,表示1到1的距離為0 
	
	while(heap.size()){
		auto t = heap.top();
		heap.pop();
		
		int ver = t.second, distance = t.first; // distance :結(jié)點(diǎn)1到結(jié)點(diǎn)ver的距離
		if(st[ver]) continue;  // 冗余的話跳過(guò)
		st[ver] = true;
		
		for(int i=h[ver]; i!=-1; i=ne[i]){ // 鄰接表遍歷,從h[ver]開(kāi)始遍歷可達(dá)的所有結(jié)點(diǎn)
			int j = e[i];
			
//			w[i]:結(jié)點(diǎn)ver到結(jié)點(diǎn)j的距離
			if(dist[j]>distance + w[i]){ // 1--->i的距離 和 1--->ver--->i的距離相比
				dist[j] = distance + w[i]; 
				heap.push({dist[j],j});
			}
		} 
	}
	
	if(dist[n] == 0x3f3f3f3f) return -1;
	else return dist[n];
}
int main(){
	cin>>n>>m;
//	memset(g,0x3f,sizeof g);
	memset(h,-1,sizeof h);;
	for(int i=0;i<m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		
	}	
	
	int res = dijkstra();
	
	printf("%d",res);
	
	return 0;
	
	
}

1003 Emergency

原題鏈接

原題鏈接

題目

題目大意:n個(gè)城市m條路,每個(gè)城市有救援小組,所有的邊的邊權(quán)已知。給定起點(diǎn)和終點(diǎn),求從起點(diǎn)到終點(diǎn)的最短路徑條數(shù)以及最短路徑上的救援小組數(shù)目之和。如果有多條就輸出點(diǎn)權(quán)(城市救援小組數(shù)目)最大的那個(gè)

思路

用一遍Dijkstra算法,救援小組個(gè)數(shù)相當(dāng)于點(diǎn)權(quán),用Dijkstra求邊權(quán)最小的最短路徑的條數(shù),以及這些最短路徑中點(diǎn)權(quán)最大的值
dis[i]表示從出發(fā)點(diǎn)到i結(jié)點(diǎn)最短路徑的路徑長(zhǎng)度,
num[i]表示從出發(fā)點(diǎn)到i結(jié)點(diǎn)最短路徑的條數(shù),
w[i]表示從出發(fā)點(diǎn)到i點(diǎn)救援隊(duì)的數(shù)目之和
當(dāng)判定dis[u] + e[u][v] < dis[v]的時(shí)候,
不僅僅要更新dis[v],還要更新num[v] = num[u], w[v] = weight[v] + w[u];
如果dis[u] + e[u][v] == dis[v],還要更新num[v] += num[u],而且判斷一下是否權(quán)重w[v]更小,如果更小了就更新w[v] = weight[v] + w[u];

題解

基于上述樸素版dijkstra進(jìn)行改進(jìn),

#include <bits/stdc++.h>
using namespace std;
//題目大意:n個(gè)城市m條路,每個(gè)城市有救援小組,所有的邊的邊權(quán)已知。給定起點(diǎn)和終點(diǎn),求從起點(diǎn)到終點(diǎn)的最短路徑條數(shù)以及最短路徑上的救援小組數(shù)目之和。如果有多條就輸出點(diǎn)權(quán)(城市救援小組數(shù)目)最大的那個(gè)~
//
//分析:用一遍Dijkstra算法~救援小組個(gè)數(shù)相當(dāng)于點(diǎn)權(quán),用Dijkstra求邊權(quán)最小的最短路徑的條數(shù),以及這些最短路徑中點(diǎn)權(quán)最大的值~dis[i]表示從出發(fā)點(diǎn)到i結(jié)點(diǎn)最短路徑的路徑長(zhǎng)度,num[i]表示從出發(fā)點(diǎn)到i結(jié)點(diǎn)最短路徑的條數(shù),w[i]表示從出發(fā)點(diǎn)到i點(diǎn)救援隊(duì)的數(shù)目之和~當(dāng)判定dis[u] + e[u][v] < dis[v]的時(shí)候,不僅僅要更新dis[v],還要更新num[v] = num[u], w[v] = weight[v] + w[u]; 如果dis[u] + e[u][v] == dis[v],還要更新num[v] += num[u],而且判斷一下是否權(quán)重w[v]更小,如果更小了就更新w[v] = weight[v] + w[u]; 

const int N = 510;
int g[N][N];
int c1,c2;
int dist[N]; //dist[i]表示從出發(fā)點(diǎn)到i結(jié)點(diǎn)最短路徑的路徑長(zhǎng)度
int weight[N]; //每個(gè)城市救援隊(duì)數(shù)量
int w[N]; //w[i]表示從出發(fā)點(diǎn)到i點(diǎn)救援隊(duì)的數(shù)目之和
bool st[N]; 
int num[N]; //num[i]表示從出發(fā)點(diǎn)到i結(jié)點(diǎn)最短路徑的條數(shù)

int n,m;

void dij(){
	w[c1] = weight[c1];
	memset(dist,0x3f,sizeof dist);
	dist[c1] = 0;
	num[c1] = 1;
	int t;
	for(int i=0;i<n;i++){
		t = -1;
		for(int j=0;j<n;j++){
			if(!st[j] && (t==-1 || dist[t] >dist[j]) )
			{
				t = j;
			}
		}
		st[t] = true;
		for(int j=0;j<n;j++){
//			dist[j] = min(dist[j],dist[t] + g[t][j]);
			if(dist[j]>dist[t]+g[t][j]){ //當(dāng)判定dis[u] + e[u][v] < dis[v]的時(shí)候,不僅僅要更新dis[v],還要更新num[v] = num[u], w[v] = weight[v] + w[u]; 
				dist[j] = dist[t]+g[t][j];
				num[j] = num[t];
				w[j] = w[t] + weight[j];  
//				cout<<t<<" "<<w[t]<<endl;
//				w[j]+=weight[t];
			}
			else if(dist[j]==dist[t]+g[t][j]){ //如果dis[u] + e[u][v] == dis[v],還要更新num[v] += num[u],而且判斷一下是否權(quán)重w[v]更小,如果更小了就更新w[v] = weight[v] + w[u]; 
				num[j] = num[t]+num[j];
				if(w[t]+weight[j] > w[j]){
					w[j] = w[t] + weight[j];
				}
			}	
		}
	}
	
//	return w[c2];	
}
int main(){
	cin>>n>>m>>c1>>c2;
	
	for(int i=0;i<n;i++){
		int t;
		cin>>t;
		weight[i] = t;
	}
	memset(g,0x3f,sizeof g); // 賦值無(wú)窮大 
	
	for(int i=0;i<m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		g[x][y] = g[y][x] = z; // 無(wú)向圖!所以存雙向信息 
	}
	
	dij();
	
	cout<<num[c2]<<" "<<w[c2];
} 

參考鏈接:1003. Emergency (25)-PAT甲級(jí)真題(Dijkstra算法)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-624430.html

到了這里,關(guān)于二、搜索與圖論6:Dijkstra 模板題+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Dijkstra算法求最短路

    Dijkstra算法求最短路

    Dijkstra算法的流程如下: 1.初始化dist[1] = 0,其余節(jié)點(diǎn)的dist值為無(wú)窮大。 2.找出一個(gè)未被標(biāo)記的、dist[x]最小的節(jié)點(diǎn)x,然后標(biāo)記節(jié)點(diǎn)x。 3.掃描節(jié)點(diǎn)x的所有出邊(x,y,z),若dist[y] dist[x] + z,則使用dist[x] + z更新dist[y]。 4.重復(fù)上述2~3兩個(gè)步驟,直到所有的節(jié)點(diǎn)都被標(biāo)記。 Dijk

    2024年02月06日
    瀏覽(20)
  • 圖算法——求最短路徑(Dijkstra算法)

    圖算法——求最短路徑(Dijkstra算法)

    ? ? ? ? 目錄 一、什么是最短路徑 二、迪杰斯特拉(Dijkstra)算法 ?三、應(yīng)用Dijkstra算法 (1) Dijkstra算法函數(shù)分析 ????????求圖的最短路徑在實(shí)際生活中有許多應(yīng)用,比如說(shuō)在你在一個(gè)景區(qū)的某個(gè)景點(diǎn),參觀完后,要怎么走最少的路程到你想?yún)⒂^的下個(gè)景點(diǎn),這就利用到

    2023年04月15日
    瀏覽(19)
  • 第三章 搜索與圖論(二)(最短路)

    第三章 搜索與圖論(二)(最短路)

    1、對(duì)于稠密圖,由于樸素版的dijkstra算法與邊數(shù)無(wú)關(guān)使用這種算法的復(fù)雜度較低。稀疏圖用堆優(yōu)化版的算法;單源最短路中存在負(fù)權(quán)邊用SPFA 算法通常較好;多源用floyd算法; ?難點(diǎn):如何建圖,抽象為最短路問(wèn)題。 由于稠密圖用這種算法,鄰接矩陣存圖,注意把g初始化為

    2024年02月21日
    瀏覽(17)
  • 搜索與圖論第六期 最短路問(wèn)題

    搜索與圖論第六期 最短路問(wèn)題

    Dijkstra算法?zhǔn)且环N著名的圖算法,主要用于求解有權(quán)圖中的單源最短路徑問(wèn)題。它由荷蘭計(jì)算機(jī)科學(xué)家艾茲赫爾·戴克斯特拉(Edsger Wybe Dijkstra)在1956年首次提出。Dijkstra算法的核心思想是通過(guò)以下步驟逐步構(gòu)建最短路徑樹(shù): 初始化:創(chuàng)建一個(gè)空白的最短路徑字典,其中每

    2024年02月20日
    瀏覽(20)
  • 第三章 搜索與圖論(二)——最短路問(wèn)題

    第三章 搜索與圖論(二)——最短路問(wèn)題

    源點(diǎn)表示起點(diǎn),匯點(diǎn)表示終點(diǎn) 一些認(rèn)識(shí): m和 n 2 n^2 n 2 一個(gè)級(jí)別是稠密圖,m和n一個(gè)級(jí)別是稀疏圖 最短路問(wèn)題不區(qū)分有向圖與無(wú)向圖,因?yàn)闊o(wú)向圖是一種特殊的有向圖,能解決有向圖的最短路問(wèn)題,就能解決無(wú)向圖的最短路問(wèn)題 起點(diǎn)確定,終點(diǎn)是除起點(diǎn)外的其他點(diǎn) 默認(rèn)n表示

    2024年02月13日
    瀏覽(35)
  • 12.圖論1 最短路之dijkstra算法

    二分圖 判定:染色法。 性質(zhì): 可以二著色。 無(wú)奇圈。 樹(shù)的直徑模板 兩遍dfs/bfs,證明時(shí)反證法的核心是用假設(shè)推出矛盾。 設(shè)1是一開(kāi)始隨機(jī)選的點(diǎn),s是與其最遠(yuǎn)的點(diǎn),證明s是直徑的一端。 反證:假設(shè)s不是直徑的一端,ss是直徑的一端。 現(xiàn)在要做的就是證明ss是直徑的一端

    2024年02月20日
    瀏覽(18)
  • 圖論算法基礎(chǔ):單源最短路徑Dijkstra算法分析

    圖論算法基礎(chǔ):單源最短路徑Dijkstra算法分析

    在 有向帶權(quán)圖 中給定一個(gè)起始頂點(diǎn)(源點(diǎn)),Dijkstra算法可以求出 所有其他頂點(diǎn) 到源點(diǎn)的最短路徑,Dijkstra算法 不能用于同時(shí)含有正負(fù)權(quán)值的邊的圖 Source 頂點(diǎn)集合:已經(jīng)確定 到源點(diǎn)的最短路徑 的頂點(diǎn)就會(huì)加入 Source 集合中, Source 集合初始時(shí)只有源點(diǎn) dist 數(shù)組:用于記錄每個(gè)頂點(diǎn)到

    2024年02月11日
    瀏覽(29)
  • 【圖論算法】最短路徑算法(無(wú)權(quán)最短路徑、Dijkstra算法、帶負(fù)邊值的圖、無(wú)圈圖)

    【圖論算法】最短路徑算法(無(wú)權(quán)最短路徑、Dijkstra算法、帶負(fù)邊值的圖、無(wú)圈圖)

    本篇博客將考察各種最短路徑問(wèn)題。 ????無(wú)權(quán)最短路徑 ????Dijkstra 算法 ????具有負(fù)邊值的圖 ????無(wú)圈圖 ????所有頂點(diǎn)對(duì)間的最短路徑 ????最短路徑的例子–詞梯游戲 輸入是一個(gè)賦權(quán)圖:與每條邊 (v i , v j ) 相聯(lián)系的是穿越該邊的開(kāi)銷(xiāo)(或稱(chēng)為值

    2023年04月12日
    瀏覽(22)
  • 圖論:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)詳細(xì)版

    圖論:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)詳細(xì)版

    終于是學(xué)完了,這個(gè)最短路我學(xué)了好幾天,當(dāng)然也學(xué)了別的算法啦,也是非常的累啊。 話不多說(shuō)下面看看最短路問(wèn)題吧。 最短路問(wèn)題是有向圖,要求的是圖中一個(gè)點(diǎn)到起點(diǎn)的距離,其中我們要輸入點(diǎn)和點(diǎn)之間的距離,來(lái)求最短路。 下面分為幾類(lèi)題目: 單源匯最短路--一個(gè)起

    2024年01月21日
    瀏覽(26)
  • dijkstra模板及例題(最短路算法)

    dijkstra模板及例題(最短路算法)

    ? ? ? ? 大家好,我是永遇樂(lè)金槍魚(yú)。圖論和樹(shù)論是算法中占比大且非常重要的內(nèi)容,而且樹(shù)論是特殊的圖論,而圖論中最經(jīng)典的就是求解最短路,而最短路算法是比較廣泛且冗雜的算法,與其相關(guān)的有較多的算法,下面我給大家講講常用算法之一——dijkstra算法。 ???博客

    2023年04月08日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包