農夫約翰正在乙個新的銷售區域對他的牛奶銷售方案進行調查。
他想把牛奶送到t個城鎮,編號為1~t。
這些城鎮之間通過r條道路 (編號為1到r) 和p條航線 (編號為1到p) 連線。
每條道路 i 或者航線 i 連線城鎮ai到bi,花費為ci。
對於道路,0≤ci≤10,000;然而航線的花費很神奇,花費ci可能是負數(−10,000≤ci≤10,000)。
道路是雙向的,可以從ai到bi,也可以從bi到ai,花費都是ci。
然而航線與之不同,只可以從ai到bi。
事實上,由於最近恐怖主義太囂張,為了社會和諧,出台了一些政策:保證如果有一條航線可以從ai到bi,那麼保證不可能通過一些道路和航線從bi回到ai。
由於約翰的奶牛世界公認十分給力,他需要運送奶牛到每乙個城鎮。
他想找到從傳送中心城鎮s把奶牛送到每個城鎮的最便宜的方案。
輸入格式
第一行包含四個整數t,r,p,s。
接下來r行,每行包含三個整數(表示乙個道路)ai,bi,ci。
接下來p行,每行包含三個整數(表示一條航線)ai,bi,ci。
輸出格式
第1…t行:第i行輸出從s到達城鎮i的最小花費,如果不存在,則輸出「no path」。
資料範圍
1≤t≤25000,
1≤r,p≤50000,
1≤ai,bi,s≤t,
#include
#include
#include
#include
#include
#define x first
#define y second
using
namespace std;
typedef pair<
int,
int> pii;
const
int n =
25010
, m =
150010
, inf =
0x3f3f3f3f
;int n, mr, mp, s;
int id[n]
;//存放每乙個點的連通塊編號
int h[n]
, e[m]
, w[m]
, ne[m]
, idx;
int dist[n]
, din[n]
;vector<
int> block[n]
;//存下每乙個連通塊點有哪些
int bcnt;
bool st[n]
;queue<
int> q;
void
add(
int a,
int b,
int c)
void
dfs(
int u,
int bid)}}
void
dijkstra
(int bid));
}while
(heap.
size()
));//如果在同乙個連通塊就放入堆中繼續更新其他點}}
}}void
topsort()
}int
main()
for(
int i =
1; i <= n; i ++)if
(!id[i]
)while
(mp --
)topsort()
;for
(int i =
1; i <= n; i ++)if
(dist[i]
> inf /
2) cout <<
"no path"
<< endl;
else cout << dist[i]
<< endl;
return0;
}
AcWing 342 道路與航線
題目傳送門 分析 本題解題邏輯比較複雜,但是一旦理順了思路,也是可以很快 ac 的。首先分析下題意,城鎮之間有兩種路徑,雙向 邊權非負的道路,以及單向 邊權可能是負數的航線,並且航線不存在環。抽象成圖模型就是有兩類邊,正權的雙向邊和可以是負權的單向邊,若存在從 a 到 b 的單向邊,則 b 不可能通...
道路與航線
農夫約翰正在乙個新的銷售區域對他的牛奶銷售方案進行調查。他想把牛奶送到t個城鎮,編號為1 t。這些城鎮之間通過r條道路 編號為1到r 和p條航線 編號為1到p 連線。每條道路 ii 或者航線 ii 連線城鎮ai到bi,花費為ci。對於道路,0 ci 10,0000 ci 10,000 然而航線的花費...
洛谷 P3008 道路與航線
因為有負權邊,所以不能 dijkstra 本題資料還卡 spfa 但是我們發現,有負權的都是有向邊,而且如果把無向邊連成的聯通塊看成乙個點的話,有向邊就連成了乙個 dag,所以我們可以對所有的聯通塊用dij求最短路 在 dag上用拓撲序求最短路 注意 堆優化的 dijkstra 在定義的結構體重載運...