如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。
輸入格式:
第一行包含三個整數n、
m、s ,分別表示點的個數、有向邊的個數、出發點的編號。
接下來
m 行每行包含三個整數fi
、gi、
wi,分別表示第
i 條有向邊的出發點、目標點和長度。
輸出格式:
一行,包含
n個用空格分隔的整數,其中第
i 個整數表示從點
s出發到點i的最短路徑長度(若 s=
i 則最短路徑長度為
0 ,若從點
s無法到達點
i ,則最短路徑長度為
2147483647
)輸入樣例#1:
輸出樣例#1: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
時空限制:
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的最短...