洛谷 P3371 模板 單源最短路徑

2021-08-09 11:11:36 字數 2172 閱讀 4203

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。

輸入格式:

第一行包含三個整數n、

m、s ,分別表示點的個數、有向邊的個數、出發點的編號。

接下來

m 行每行包含三個整數fi

、gi、

wi,分別表示第

i 條有向邊的出發點、目標點和長度。

輸出格式:

一行,包含

n個用空格分隔的整數,其中第

i 個整數表示從點

s出發到點i的最短路徑長度(若 s=

i 則最短路徑長度為

0 ,若從點

s無法到達點

i ,則最短路徑長度為

2147483647

)輸入樣例#1:

4 6 1

1 2 2

2 3 2

2 4 1

1 3 5

3 4 3

1 4 4

輸出樣例#1:
0 2 4 3
時空限制:

1000ms,128m

資料規模:

對於 20

% 的資料:n≤

5,m≤

15

對於 40%

的資料:n≤

100,m≤

10000

對於 70

% 的資料:n≤

1000,m

≤100000

對於 100

% 的資料:n≤

10000,m

≤500000

樣例說明:

當然是四種演算法都有啦!

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

template

void input(t &x)

namespace __floyd

}namespace __dijkstra

}namespace __spfa

};edge edge[maxm];

int head[maxn],cnt;

void addedge(int u,int v,int w)

queue

q;bool inq[maxn];

int dis[maxn];

void spfa(int n,int m,int s)

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

dis[i]=inf,inq[i]=false;

q.push(s);

inq[s]=true;

dis[s]=0;

while(!q.empty()) }}

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

printf("%d ",dis[i]);

return;

}}namespace __dijkstra_heap

};edge edge[maxm];

int head[maxn],cnt;

void addedge(int u,int v,int w)

struct data

bool

operator

< (const data &q)const

};priority_queuevector

,greater> heap;

int dis[maxn];

bool vis[maxn];

void dijkstra(int n,int m,int s)

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

dis[i]=inf,vis[i]=false;

dis[s]=0;

heap.push(data(dis[s],s));

while(!heap.empty())

}int main()

洛谷 P3371 模板 單源最短路徑

題目大意 在乙個有向圖中,有m條邊 1 m 500000 n個點 1 n 10000 求點s到1 n個點的最短路徑長度,無最短路就輸出maxlongint。spfa 佇列優化 dis i 表示點s到i的最短路徑,一開始dis陣列為maxlongint。1.用佇列優化,就可以省略列舉每個點的時間,由o...

洛谷P3371 模板 單源最短路徑

p3371 模板 單源最短路徑 看了b站上的spfa演算法講解,重新敲了一遍這個題,學習spfa演算法。題意 給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。spfa演算法是對bellman ford演算法的優化。後者複雜度為o nm 每一輪都對所有邊確定是否更新。前者將點加入佇列中,用b...

洛谷 P3371 模板 單源最短路徑

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短...