時間限制:c/c++
1秒,其他語言2秒
空間限制:c/c++
262144k,其他語言524288k
special judge,
64bit io format:
%lld
題目描述
「題目名稱只是吸引你來做題的啦,其實和題目沒什麼卵關係:o( ̄▽ ̄)o」 —— 歷史——殿堂輸入描述:
第一行兩個整數n,m,表示有n個點,m條邊。輸出描述:接下來m行,每行三個數,u,v,w,表示有一條從u到v。
輸出m行,每行三個整數u,v,w表示有從u到v的邊邊權改完後是為w。ps:按輸入順序輸出。
示例1輸入
複製
5101
2-438313
-993024
-733115
-217523
1196225
1638245
1142014
3797835
1383634
14617
輸出
複製
120
1302
4015
0231750925
1417445
188114
4969235
608134
16401
備註:
n<=103,m<=3*103,|w|<=109 資料保證有解,保證沒有負環,保證任意兩點間最短路唯一,保證圖聯通 資料有梯度(所有邊加相同值變正肯定不行,具體看官方題解第一段但是出題人也不知道能寫什麼部分分)
其實想明白就不難
先說結論:建立乙個超級源點與每個節點相連,邊權為0,然後從超級源點跑spfa,對於u到v邊權為w的邊,新邊權為dis[u]-dis[v]+w
原理:spfa中更新最短路徑的關鍵是:dis[v]>=dis[u]+w
當滿足這個條件時,路徑就可以更新。而當路徑為最短路時,也就有dis[u]+w-dis[v]>=0成立
我們再看看點u到v的最短路徑為u->x->y->v
那麼最短路徑長度就是:dis(u,x)+dis(x,y)+dis(y,v)
dis(u,x)表示u到x的最短路徑
現在我們要更改邊權,(因為邊權值可能為負數),使得單個邊權的值》=0,
dis[u]+w-dis[v]>=0,w就相當於dis(u,x),我們帶入得到:
dis[u]-dis[x]+dis[x]-dis[y]+dis[y]-dis[v]+dis(u,x)+dis(x,y)+dis(y,v)
化簡得:
dis(u,x)+dis(x,y)+dis(y,v)+dis[u]-dis[v]
dis[u]-dis[v]是定值
前面三個就是原路徑的w,這不就是我們一開始說的結論
#include
#define inf 0x3f3f3f3f
using
namespace std;
int n,m;
struct node
edge[
100005];
long
long head[
10005
],tot=
0,vis[
10005
],dis[
10005];
void
add(
int u,
int v,
int w)
void
spfa()
}}}}
int main (
)for
(i=1
;i<=n;
++i)
add(
0,i,0)
;spfa()
;for
(i=1
;i<=m;
++i)
return0;
}
牛客網 每日一題 7月27日題目精講 烏龜棋
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n 個格仔,每個格仔上乙個分數 非負整數 棋盤第1 格是唯一的起點,第n 格是終點,遊戲要求玩家控...
牛客網 每日一題 4月23日題目精講 邊的染色
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld小團有一張n個點,m條邊的無向圖g,有些邊上已經被標記了0或1,表示它的邊權。現在你需要給剩下的邊標記邊權為0或1,求有幾種標記的方式滿足 對於g中任意乙個環,裡面所有邊...
牛客網 每日一題 4月14日題目精講 Xorto
傳送時間限制 c c 2秒,其他語言4秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 給定乙個長度為n的整數陣列,問有多少對互不重疊的非空區間,使得兩個區間內的數的異或和為0。輸入描述 第一行乙個數n表示陣列長度 第二行n個整數表示陣列 1 n 10...