P5960 模板 差分約束演算法

2021-10-09 19:08:11 字數 1845 閱讀 7990

h yp

erli

nk

hyperlink

hyperl

ink de

scri

ptio

ndescription

descri

ptio

n 給定乙個形如xi−

xj≤y

x_i-x_j\leq y

xi​−xj

​≤y的n

nn元一次不等式組

求x

xx的一組整數解

s ol

utio

nsolution

soluti

on xi−

xj≤k

x_i-x_j\leq k

xi​−xj

​≤k

我們知道乙個最短路陣列d

dd,若有邊(i,

j)

(i,j)

(i,j

)它最後一定滿足dj≤

di+k

d_j\leq d_i+k

dj​≤di

​+k若有乙個最長路陣列d

dd,若有邊(i,

j)

(i,j)

(i,j

)它最後一定滿足dj≥

di+k

d_j\geq d_i+k

dj​≥di

​+k首先我們建邊(0,

i,0)

(0,i,0)

(0,i,0

)意義後面說

觀察到與上述不等式十分相似,可以利用spf

aspfa

spfa

判負環的思想

建立邊(j,

i,w)

(j,i,w)

(j,i,w

),跑最短路,最後可以得到d

dd最大的一組非正整數解

建立邊(i,

j,−w

)(i,j,-w)

(i,j,−

w),跑最長路,最後可以得到d

dd的一組最小正整數解

本**採用的是後者

時間複雜度:o(k

m)

o(km)

o(km

),最壞情況o(n

m)

o(nm)

o(nm)

c od

ecode

code

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

int n,m,dis[

5010

],tot,l[

5010

],in[

5010];

bool vis[

5010];

struct nodee[

20010];

inline

void

add(

int u,

int v,

int w)

;l[u]

=tot;

return;}

queue<

int>q;

inline ll read()

inline

bool

spfa

(int s)

}}vis[u]

=false;}

return

false;}

signed

main()

P5960 模板 差分約束演算法

我記得以前寫過差分約數的部落格,可是找不到了,就再寫一遍吧。a b k a b k 要求最終結果滿足這個式子,加源點跑最短路,若能跑出來,則最終一定滿足。include include include include include include include define ll long lo...

洛谷 P5960 模板 差分約束演算法(差分約束)

題目中x1 x 1 y1可以轉變為 x1 x 1 y1 換一下字母更顯然易見 dis v dis u edge i w 那麼便可以轉換成圖上的最短路問題 解集 因為題中並沒有說明是聯通圖,可以設乙個超級源點,然後向每個節點連一條邊權為0的邊,然後從0點開始做最短路。注意建邊是從x 1連向x1。ac ...

洛谷5960 模板 差分約束演算法 題解

雖然說知道這玩意可是從來沒寫過 同時記錄差分約束原理。對於給定的式子 x y le c 移動之得 x le y c 轉換為圖論模型,做起點,終點,權值為 y,x,c 的邊,可發現如果我們對這個圖跑最短路 先不要管怎麼跑出來的233 那麼一定有 dis x le dis y c 也就是說,此時每個點的...