免費個人簡歷表電子版武漢企業(yè)seo推廣
【模板】單源最短路徑(弱化版)
題目背景
本題測試數(shù)據(jù)為隨機數(shù)據(jù),在考試中可能會出現(xiàn)構(gòu)造數(shù)據(jù)讓SPFA不通過,如有需要請移步 P4779。
題目描述
如題,給出一個有向圖,請輸出從某一點出發(fā)到所有點的最短路徑長度。
輸入格式
第一行包含三個整數(shù) n , m , s n,m,s n,m,s,分別表示點的個數(shù)、有向邊的個數(shù)、出發(fā)點的編號。
接下來 m m m 行每行包含三個整數(shù) u , v , w u,v,w u,v,w,表示一條 u → v u \to v u→v 的,長度為 w w w 的邊。
輸出格式
輸出一行 n n n 個整數(shù),第 i i i 個表示 s s s 到第 i i i 個點的最短路徑,若不能到達則輸出 2 31 ? 1 2^{31}-1 231?1。
樣例 #1
樣例輸入 #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
提示
【數(shù)據(jù)范圍】
對于 20 % 20\% 20% 的數(shù)據(jù): 1 ≤ n ≤ 5 1\le n \le 5 1≤n≤5, 1 ≤ m ≤ 15 1\le m \le 15 1≤m≤15;
對于 40 % 40\% 40% 的數(shù)據(jù): 1 ≤ n ≤ 100 1\le n \le 100 1≤n≤100, 1 ≤ m ≤ 1 0 4 1\le m \le 10^4 1≤m≤104;
對于 70 % 70\% 70% 的數(shù)據(jù): 1 ≤ n ≤ 1000 1\le n \le 1000 1≤n≤1000, 1 ≤ m ≤ 1 0 5 1\le m \le 10^5 1≤m≤105;
對于 100 % 100\% 100% 的數(shù)據(jù): 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1≤n≤104, 1 ≤ m ≤ 5 × 1 0 5 1\le m \le 5\times 10^5 1≤m≤5×105, 1 ≤ u , v ≤ n 1\le u,v\le n 1≤u,v≤n, w ≥ 0 w\ge 0 w≥0, ∑ w < 2 31 \sum w< 2^{31} ∑w<231,保證數(shù)據(jù)隨機。
Update 2022/07/29:兩個點之間可能有多條邊,敬請注意。
對于真正 100 % 100\% 100% 的數(shù)據(jù),請移步 P4779。請注意,該題與本題數(shù)據(jù)范圍略有不同。
樣例說明:
圖片1到3和1到4的文字位置調(diào)換
#include<bits/stdc++.h>
using namespace std;
struct aty{int v,w;
};
vector<aty> E[100001];
queue<int> q;
int n,m,s,dis[100001],u,v,w;
bool vis[100001];
int main(){scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);E[u].push_back({v,w});}q.push(s);for (int i = 1; i <= n; i++)dis[i] = 0x7FFFFFFF;vis[s]=1;dis[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<E[u].size();i++){if(dis[E[u][i].v]>dis[u]+E[u][i].w){dis[E[u][i].v]=dis[u]+E[u][i].w;if(!vis[E[u][i].v]){vis[E[u][i].v]=true;q.push(E[u][i].v);}}}}for(int i=1;i<=n;i++){printf("%d ",dis[i]);}return 0;
}