單源最短路徑(弱化版)
阿新 • • 發佈:2018-12-09
題目大意:
給出一個有向圖,請輸出從S出發到所有點的最短路徑長度。
解題思路:
看到資料範圍 Spfa 然後int錯了,我就把inf 10改成了2147483647 一看,dis會炸掉,於是我把dis改成了long long,保險期間,inf 也改成了long long
看H*B的碼風,我打算試一試,發現並不爽,但是我懶得改
Accepted code:
獻上本蒟蒻的標風程式碼:
#include <bits/stdc++.h>
using namespace std;
const int inf = 1000000000;
struct node {
int to, z, next;
}e[200001];
int last[100001], dis[100001], n, m, S, cnt;
bool v[100001];
inline void Add(int x, int y, int z) {
e[++cnt].to = y; e[cnt].z = z; e[cnt].next = last[x]; last[x] = cnt;
}
void Spfa() {
dis[S] = 0; v[S] = 1;
queue <int> q;
q.push(S);
while (q.size()) {
int x = q.front(); v[x] = 0; q.pop();
for (int i = last[x]; i; i = e[i].next) {
int y = e[i].to;
if (dis[y] > dis[x] + e[i].z) {
dis[y] = dis[x] + e[i].z;
if (!v[y]) {
q.push(y);
v[y] = 1;
}
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &S);
for (int i = 1; i <= m; i++) {
int x, y, z; scanf("%d%d%d", &x, &y, &z);
Add(x, y, z);
}
for (int i = 1; i <= n; i++) dis[i] = inf;
Spfa();
for (int i = 1; i <= n; i++) printf("%d ", dis[i]);
}