牛客網 每日一題 7月23日題目精講 wpy的請求

2021-10-08 18:11:46 字數 2194 閱讀 2673

時間限制: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...