AcWing 342 道路與航線

2021-10-09 11:47:49 字數 1944 閱讀 6584

農夫約翰正在乙個新的銷售區域對他的牛奶銷售方案進行調查。

他想把牛奶送到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 在定義的結構體重載運...