【SPFA】Party(jzoj 1328)
生活随笔
收集整理的這篇文章主要介紹了
【SPFA】Party(jzoj 1328)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Party
jzoj 1328
題目大意
有一個有向圖,給你一個x,讓你求每一個點到x再回去的最短路徑,輸出所有最短路徑的最大值
輸入樣例
4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3輸出樣例
10
樣例解釋
數據范圍
1?x?N?10001\leqslant x\leqslant N\leqslant 10001?x?N?1000
1?m?1000001\leqslant m\leqslant 1000001?m?100000
1?ti?1001\leqslant t_i\leqslant 1001?ti??100
解題思路
每一條邊建一條正邊一條反邊,從x跑兩遍spfa,然后合在一起即可
代碼
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n, m, s, x, y, z, w, h, ans, tot, p[1500], b[1500], bb[1500], head[1500], headd[1500]; struct rec {int to, l, next; }a[100500], e[100500]; void add(int x, int y, int z) {a[++tot].to = y;a[tot].l = z;a[tot].next = head[x];head[x] = tot;e[++w].to = x;//反邊e[w].l = z;e[w].next = headd[y];headd[y] = w; } void spfa() {memset(b, 127/3, sizeof(b));queue<int>d;d.push(s);p[s] = 1;b[s] = 0;while(!d.empty())//最短路{h = d.front();d.pop();for (int i = head[h]; i; i = a[i].next)if (b[h] + a[i].l < b[a[i].to]){b[a[i].to] = b[h] + a[i].l;if (!p[a[i].to]){p[a[i].to] = 1;d.push(a[i].to); }} p[h] = 0;} memset(bb, 127/3, sizeof(bb));d.push(s);p[s] = 1;bb[s] = 0;while(!d.empty())//反的最短路{h = d.front();d.pop();for (int i = headd[h]; i; i = e[i].next)if (bb[h] + e[i].l < bb[e[i].to]){bb[e[i].to] = bb[h] + e[i].l;if (!p[e[i].to]){p[e[i].to] = 1;d.push(e[i].to); }} p[h] = 0;} return; } int main() {scanf("%d %d %d", &n, &m, &s);for (int i = 1; i <= m; ++i){scanf("%d %d %d", &x, &y, &z);add(x, y, z);} spfa();for (int i = 1; i <= n; ++i)ans = max(ans, b[i] + bb[i]);//合在一起printf("%d", ans);return 0; }總結
以上是生活随笔為你收集整理的【SPFA】Party(jzoj 1328)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字化转型行业大奖“鼎革奖”揭晓,联想集
- 下一篇: 纪中B组模拟赛总结(2020.2.13)