最短路學習記錄

2021-08-19 11:26:10 字數 1616 閱讀 2168

dijkstra解決不了帶有負權值的最短路問題,因為disjkstra源於貪心演算法,它計算的是每個點的最優解,前面確定好的點就不會影響後面點的鬆弛。在一條到目的地的路徑上,前面得出的解不會因為後面的鬆弛而改變。但是如果路線中有負權值,這時則起點到某點的最最優解會改變,這時前面的一些點已經鬆弛過來,很多值無法更新了,所有得出的解是錯的。因此需要另一種寫法,學會了再說。

1.til the cows come home(最短路)
#include#include#define max 1000+4

#define inf 99999999

using namespace std;

//用二維陣列儲存邊,遍歷時按點鬆弛所有兩點之間,時間複雜度較大。

int map[max][max];

int t,n;

int dis[max];

int book[max];

int v;

void init()//初始化二維陣列,i==j表示本身初始化為0,其他初始化為無窮大,表示無限遠。

else

map[i][j]=inf;}}

}void dijk()

for(int i=1;i<=n-1;i++)//遍歷除起點外的所有點,它更新了dis上存的最優解。

}/*for(int i=1;i<=n;i++)}}

printf("%d\n",dis[n]);

}int main()

s[max];

void init()

}double d(int i,int j)//計算兩點之間的距離。

void dijk()

//題目需要找出其中一條路徑上兩個石頭之間的最大距離,所以鬆弛時,取到該點最優解(dis)和該點到下一點距離的大值————————因為它求的是一條路上的大值

//再取取小值——————因為要找出所有路徑中最短的值,我們可以繞過那些大距離的路徑,走小距離的路,不影響到達目的地

for(int i=1;i<=n-1;i++)

}/*for(int j=1;j<=n;j++)

cout《二、spfa(佇列優化的bellman)

相對 dijkstra節省時間複雜度,時間複雜度低,比較常用,它利用了鄰接鍊錶來儲存邊。因為它在鬆弛的時候,用了佇列,所以對於多重條件的題目,我們可以用優先佇列來處理,對入隊元素選取優值,鬆弛,節省時間,甚至某種情況下還必須這樣做。

1.通道安全

#include #includeusing namespace std;

const int n=11000;

const int m=55000*2;

int vis[n],cnt,head[n],n,m;

double d[n];

struct node

e[m];

void init()

void add(int u,int v,double p)}}

//cout<}

return d[n];

}int main()

printf("%.6f\n",spfa()*100);

}}

歐濤最短路 記錄最短路徑

就是普通的最短路,建圖時點的距離小於m的連雙向邊,自認為寫了很多最短路卻不知道怎麼記錄最短路的路徑。在鬆弛裡記錄就好了,每次鬆弛都記錄被鬆弛點的前驅,這樣當乙個點多次鬆弛的時候,就可以多次更新它的前驅,當它無法鬆弛時就是最短路徑上的點,也就是記錄下來的最後一次鬆弛的前驅。然後從終點開始遍歷前驅,存在...

最短路 記錄路徑 變形!!

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。...

Breaking Good(最短路 記錄路徑)

題意n個點,m條路,路長度都是1,每條路有壞的 1 有好的 0 逃犯要找出從 1 到 n 的最短路徑 不管路是好是壞 同時將不是最短路徑上的路炸壞掉 如果這條路本身就是壞的就不用炸 還要將最短路徑上的壞的路修好 本來就是好的路不用修 如果最短路徑有多條,選下力氣最少的哪一條路徑 即 需要炸毀的路數 ...