SPFA 全面講解

2022-05-18 01:17:28 字數 3800 閱讀 4912

——最短路高效演算法
標籤: 最短路

首先,在下面的講解中,我們要用到幾個變數:

n 表示一共有n個點。

s 表示開始點。

t 表示結束點。

dist[maxn]:d[i]表示從s到i的最短路徑

head[maxn]:head[i]記錄前驅。

queue\(\)q,也就是佇列。

flag[maxn]:f[i]表示i在不在佇列中

\(spfa可以處理負權邊!!\)

首先add乙個鄰接表以及乙個用來搞鄰接表的struct

struct point

edge[maxn];

int total=0;

void add(int f,int t,int l)

首先,我們先處理初始化,順帶輸入。。。

int main()

spfa(s);

}

然後就是佇列+鬆弛操作。

int spfa()}}}

那麼正式的講解從現在開始!!

首先我們建乙個圖用來方便講解。

title:現在我們建圖, 裡面包含有a b c d e f g 

a->b: 24

a->d:15

a->c:8

c->f:3

c->e:7

f->e:2

b->e:6

e->g:9

g->b:3

f->g:3

f->d:5

看不看得懂呢?~ ~ ~

然後我們假設a為s。

那麼我們現在建立乙個從起始點a到個點的最短路徑**。

然後按照我們的spfa的順序,首先a入隊,然後判斷到佇列非空。

將隊首元素a出隊.

然後對以a點為起始點的所有邊進行鬆弛操作(此處只有e點。)。

此時**的狀態為:

在鬆弛的時候三個點的最短路徑(估值)變小了,然後檢測到這些點在佇列中還都沒有出現。於是入隊,此時佇列中有了三個點:b,c,d。

然後隊首元素c出隊.

對以c為起始點的所有邊進行鬆弛操作。

此時**的狀態變為:

此時在列表中e的路徑估值也變小了,而且e不在佇列之中,於是e也入隊,於是佇列中的元素變成了c,d,e。

然後隊首元素c再次出隊.

對所有以c為起始點的邊進行鬆弛操作。

此時**又變了樣子:

看到了e和f的最短路徑估值再次變小,但是e在佇列中但是f不在,於是將f入隊。

隊首元素d出隊

對以d為起始點的所有邊進行鬆弛操作。

**再次變化:

此時g的最短路徑估值沒有變小,於是鬆弛失敗,沒有新節點入隊。於是接著取隊首,f,g......

最後我們的**變成了這個樣子:

此時e的最短路徑估值沒有變化,於是鬆弛失敗,此時隊列為空,於是程式結束。

然後我們要求的dist[g]就是14。

\(_完美收工_\)

\(_完美收工_\)

\(_完美收工_\)

\(_完美收工_\)

\(_完美收工_\)

\(_完美收工_\)

\(_完美收工_\)

給定n個帶權的有向圖,,求1到n的最短的簡單路徑之積。

一共m+1行。

第一行:兩個數n,m.分別表示點的總數以及邊的總數。

第2到第m+1行:每一行三個數:分別為兩個點以及連線這兩個點的邊權。

一行,共乙個數:表示所求路徑的邊權之積mod 9987的值。

3 31 2 3

2 3 3

1 3 10

很明顯的模板題了。下面是**:

//yeasion_nein

#include#include#include#include#include#include#define maxn 10010

using namespace std;

int n,m,head[1000010];

int dist[1000010];

bool flag[1000010];

queueq;

int total;

struct e

edge[1000010];

void add(int f,int t,int l)

int spfa()

}} }

}int main()

dist[1]=1;

q.push(1);

flag[1]=1;

spfa();

printf("%d",dist[n]%9987);

return 0;

}

如果這篇部落格有幫助到你的話,清點一下贊吧!!(qwq)

Java異常全面講解

異常 error 錯誤 執行中出現的嚴重錯誤,不需要我們進行更改.exception 執行中出現的不嚴重的錯誤,我們可以嘗試去更改.第一種分類 第二種分類 異常的特點 當程式出現異常的時候,程式會列印異常資訊並中斷程式。所以當同時出現多個異常的時候,只能執行第乙個。乙個簡單的異常 public cl...

Django框架全面講解

第一篇web框架 第二遍初識django 第三篇資料庫與orm 第四篇django之模板語言 第五篇django url name 詳解 第六篇 orm 操作大全 第七篇 django 認證系統 第八篇django分頁 第九篇 ajax 第十篇 form表單 第十一篇 中介軟體 第十二篇檢視層之檢視...

Django框架全面講解 Form

django中的form一般有兩種功能 輸入html 驗證使用者輸入 usr bin env python3 coding utf 8 import re from django import forms from django.core.exceptions import validationer...