基本介紹
模板題目
**實現
終於來發堆優化的迪傑斯特拉了 普通的迪傑斯特拉複雜度是o(n^2)的 感覺對於資料大的題和弗洛伊德沒什麼兩樣吧 但是堆優化後能到o((m+n) log n) 還比較不錯 但不能去搞圖中有負邊權的情況
我的**採用了大佬zheng.ht的模板 用c++的stl優先佇列實現 不知道為什麼**看起來那麼像spfa 關於stl 的東西也就不多說了 至於make_pair就是兩個東西打包吧變成乙個 在這個演算法中就能便於把點編號和距離一起壓進堆中 比較舒服
**的原理就是用堆來儲存原點到其他點的距離並且維護最小值 訪問邊的時候進行更新 總是感覺和spfa有比較像的地方
題目描述
給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。
輸入輸出格式
輸入格式:
第一行包含三個整數n、m、s,分別表示點的個數、有向邊的個數、出發點的編號。
接下來m行每行包含三個整數fi、gi、wi,分別表示第i條有向邊的出發點、目標點和長度。
輸出格式:
一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短路徑長度(若s=i則最短路徑長度為0,若從點s無法到達點i,則最短路徑長度為2147483647)
輸入輸出樣例
輸入樣例:
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
輸出樣例:
0 2 4 3
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define in = read()
typedef
long
long ll;
const ll size = 1000000 + 10000;
struct pointedge[size];
priority_queue , vector
> , greater> > q;
ll n,m,s;
ll site;
ll head[size],dis[size];
bool exist[size];
inline ll read()
while(isdigit(ch))
return num*f;
}inline
void add(ll x,ll y,ll z)
int main()
for(int i=1;i<=n;i++) dis[i] = 2147483647; dis[s] = 0;
ll u;
pairx;
q.push(make_pair(0,s));
while(!q.empty())
}for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
}//coyg
最短路徑dijkstra模板
第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示邊的條數。接下來m行表示,每行有3個數x y z。表示頂點x到頂點y邊的權值為z。求源點為1的最短路徑。題目 坐在馬桶上看演算法 演算法7 dijkstra最短路演算法 這道題我只是想練練dijkstra模板,dijkstra主要由兩個步...
最短路徑之 Dijkstra模板
一 時間複雜度為o v v 的dijkstra const int max v 100 10 const int inf 1 30 int cost max v max v 權值 int d max v 頂點 出發最短距離 bool used max v 以使用過的圖 int v 頂點數 int e...
最短路 路徑還原(dijkstra,模板)
b.wzy的大冒險 出發咯qaq 單點時限 2.0 sec 記憶體限制 512 mb 第一行兩個數n,m 1 n 103,1 m 103 接下來m行,每行三個數x,y,z,表示點 x 與點 y 之間有一條權值為 z 的有向邊 1 x,y,z 103 第一行乙個整數表示 1 到 n 的最短距離 第二行...