1. 程式人生 > >單源最短路徑(弱化版)

單源最短路徑(弱化版)

題目大意:

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

解題思路:

看到資料範圍 Spfa 然後int錯了,我就把inf 109改成了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]); }