試題描述
farmer john 正在乙個新的銷售區域對他的牛奶銷售方案進行調查。他想把牛奶送到 t (1≤t≤2.5×10^4)個城鎮 ,編號為 1 到 t。這些城鎮之間通過 r 條道路(編號為 1 到 r)和 p 條航線(編號為 1 到 p)連線。每條道路 i 或者航線 i 連線城鎮 ai到 bi,花費為 ci。
對於道路,0≤ci≤104,然而航線的花費很神奇,花費 ci可能是負數。道路是雙向的,可以從 ai到 bi,也可以從 bi到 ai,花費都是
ci。然而航線與之不同,只可以從 ai到 bi。
事實上,由於最近恐怖主義太囂張,為了社會和諧,出台了一些政策保證:如果有一條航線可以從 ai到
bi,那麼保證不可能通過一些道路和航線從 bi回到 ai。由於 fj 的奶牛世界公認十分給力,他需要運送奶牛到每乙個城鎮。他想找到從傳送中心城鎮 s
把奶牛送到每個城鎮的最便宜的方案,或者知道這是不可能的。
輸入第一行為四個空格隔開的整數:t,r,p,s;
第二到第 r+1 行:三個空格隔開的整數(表示一條道路):ai,bi和 ci;
第 r+2 到 r+p+1行:三個空格隔開的整數(表示一條航線):ai,bi和 ci。
輸出輸出 t 行,第 i 行表示到達城鎮 i 的最小花費,如果不存在輸出 no path。
輸入示例
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
輸出示例
no path
no path
5 0
-95
-100
其他說明
樣例說明
一共六個城鎮。在 1 和 2,3 和 4,5 和 6 之間有道路,花費分別是 5,5,10。同時有三條航線:3→5,4→6 和 1→3,花費分別是 −100,−100,−10。fj 的中心城鎮在城鎮 4。fj 的奶牛從 4 號城鎮開始,可以通過道路到達 3 號城鎮。然後他們會通過航線達到 5 和 6 號城鎮。但是不可能到達 1 和 2 號城鎮。
資料範圍與提示
對於全部資料,1≤t≤2.5×10^4,1≤r,p≤5×10^4,1≤ai,bi,s≤t。保證對於所有道路,0≤ci≤10^4,對於所有航線,−10^4≤ci≤10^4。
乙個很明顯的板子題,spfa要加一點優化,否則會t
具體的優化被稱作slf:
利用乙個雙端佇列,比較即將插入隊首的和隊首的dis值,如果比隊首小,就加到隊首,否則直接放到隊尾
可以減少一些無用的狀態
下面給出**
#include#include#include
#include
#include
#include
#include
#include
using
namespace
std;
intrd()
void write(int
x)int head[1000006],nxt[25001*6],to[25001*6],v[25001*6
];int
t,n,m,s;
int total=0
;void add(int x,int y,int
z)int book[250001
];int dis[250001
];deque
q;void spfa()//
spfa模板 }}
}return;}
intmain()
for(int i=1;i<=m;i++)//
讀入航線
for(int i=1;i<=t;i++) dis[i]=1299999999
; spfa();
for(int i=1;i<=t;i++)
return0;
}
道路和航線
題目描述 一張圖,有由t個節點,r條雙向邊和p條單向邊組成,每條邊有邊權且可能存在負權,求能否從s到達每個節點並且輸出最小花費。思路首先第一想法,把這張圖建出來,在跑一遍spfa即可,然而它顯然被卡了,不過似乎可以用雙端佇列優化水過去。接下就是正解。我們考慮對於所有的道路,都是正權,我們可以用dij...
道路和航線 題解
題目描述 farmer john 正在乙個新的銷售區域對他的牛奶銷售方案進行調查。他想把牛奶送到 t 個城鎮 編號為 1 到 t 這些城鎮之間通過 r 條道路 編號為 1 到 r 和 p 條航線 編號為 1 到 p 連線。每條道路 i 或者航線 i 連線城鎮 a i 到 b i 花費為 c i 對於...
道路與航線
農夫約翰正在乙個新的銷售區域對他的牛奶銷售方案進行調查。他想把牛奶送到t個城鎮,編號為1 t。這些城鎮之間通過r條道路 編號為1到r 和p條航線 編號為1到p 連線。每條道路 ii 或者航線 ii 連線城鎮ai到bi,花費為ci。對於道路,0 ci 10,0000 ci 10,000 然而航線的花費...