【模板】单源最短路径(弱化版)
題目背景
本題測試數(shù)據(jù)為隨機(jī)數(shù)據(jù),在考試中可能會(huì)出現(xiàn)構(gòu)造數(shù)據(jù)讓SPFA不通過,如有需要請移步?P4779。
題目描述
如題,給出一個(gè)有向圖,請輸出從某一點(diǎn)出發(fā)到所有點(diǎn)的最短路徑長度。
輸入格式
第一行包含三個(gè)整數(shù)N、M、S,分別表示點(diǎn)的個(gè)數(shù)、有向邊的個(gè)數(shù)、出發(fā)點(diǎn)的編號。
接下來M行每行包含三個(gè)整數(shù)Fi、Gi、Wi,分別表示第i條有向邊的出發(fā)點(diǎn)、目標(biāo)點(diǎn)和長度。
輸出格式
一行,包含N個(gè)用空格分隔的整數(shù),其中第i個(gè)整數(shù)表示從點(diǎn)S出發(fā)到點(diǎn)i的最短路徑長度(若S=i則最短路徑長度為0,若從點(diǎn)S無法到達(dá)點(diǎn)i,則最短路徑長度為2147483647)
輸入輸出樣例
輸入 #1復(fù)制 4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 輸出 #1復(fù)制 0 2 4 3說明/提示
時(shí)空限制:1000ms,128M
數(shù)據(jù)規(guī)模:
對于20%的數(shù)據(jù):N<=5,M<=15;
對于40%的數(shù)據(jù):N<=100,M<=10000;
對于70%的數(shù)據(jù):N<=1000,M<=100000;
對于100%的數(shù)據(jù):N<=10000,M<=500000。保證數(shù)據(jù)隨機(jī)。
對于真正 100% 的數(shù)據(jù),請移步?P4779。請注意,該題與本題數(shù)據(jù)范圍略有不同。
樣例說明:
圖片1到3和1到4的文字位置調(diào)換
?
本題根據(jù)數(shù)據(jù)邊數(shù)m<=500000,鄰接矩陣存不下,只能使用靜態(tài)鄰接表存儲(chǔ)。
?
#include<cstdio> #include<queue> using namespace std;const long long inf=2147483647; const int maxn=10005; const int maxm=500005; using namespace std; int n,m,s,num_edge=0; int dis[maxn],vis[maxn],head[maxm]; struct Edge{int next,to,dis; }edge[maxm];void add(int from,int to,int dis){ edge[++num_edge].next=head[from]; edge[num_edge].to=to;edge[num_edge].dis=dis;head[from]=num_edge; }void spfa(){queue<int> q;for(int i=1; i<=n; i++) {dis[i]=inf;vis[i]=0;}q.push(s); dis[s]=0; vis[s]=1;while(!q.empty()){int u=q.front();q.pop(); vis[u]=0;for(int i=head[u];i;i=edge[i].next){int v=edge[i].to; if(dis[v]>dis[u]+edge[i].dis){dis[v]=dis[u]+edge[i].dis;if(vis[v]==0){vis[v]=1;q.push(v);}}}} }int main(){scanf("%d%d%d",&n,&m,&s);for(int i=1; i<=m; i++){int f,g,w;scanf("%d%d%d",&f,&g,&w); add(f,g,w);}spfa();for(int i=1;i<=n;i++){ if(s==i){printf("0 ");}else{printf("%d ",dis[i]);}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/hrj1/p/11160489.html
總結(jié)
以上是生活随笔為你收集整理的【模板】单源最短路径(弱化版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bash之逻辑控制---for语句
- 下一篇: 常用的内置对象