洛谷P3275 糖果 差分約束 負環

2022-09-01 10:45:07 字數 1626 閱讀 3232

有nn

個小朋友和m

m個要求,其中要求的格式如下:

求至少要多少個糖果使得每個小朋友都可以分到糖果並且所有要求都滿足。

這道題的查封約束十分的明顯。可以直接列出來:

需要滿足x=y

x=y,為了寫成a≤b

a≤b的形式,可以改成x≤y

x≤y且y

≤xy≤

x需要滿足x

<

y,也就是說a≤y

−1a≤

y−1需要滿足x≥y

x≥y,直接反過來變成y≤x

y≤x即可

需要滿足x

>yx

>

y,即x≥y

+1x≥

y+1,移項得y≤x

−1y≤

x−1需要滿足x≤y

x≤y,不解釋了

對於連邊方式2和4需要特判,如果x=y

x=y那麼明顯是不成立的。

但是這道題很奇怪,負權+跑最短路+判負環只能拿70分。改成正權+最長路+判正環才可以。

而且第六個點明顯是卡了spf

aspf

a的,add

(0,i

,0)(

i=1∼

n)ad

d(0,

i,0)

(i=1

∼n)會被卡t。其實應該是可以隨機連邊的,應該可以過掉,但是看到說add

(0,i

,0)(

i=n∼

1)ad

d(0,

i,0)

(i=n

∼1)就可以過就沒有隨機了。

總之一道神題orz就對了。

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

100010

;const

int m=

300010

;int n,m,tot,x,y,z;

int head[n]

,cnt[n]

;ll dis[n]

,ans,minn;

bool vis[n]

;struct edge

e[m]

;void

add(

int from,

int to,ll dis)

bool

spfa()

}}}return1;

}int

main()

for(

int i=n;i>=

1;i--

)add(0

,i,0);

minn=

2147483647;if

(spfa()

)printf

("%lld\n"

,ans-

(minn-1)

*(ll)n);}

else

printf

("-1");

return0;

}

糖果 洛谷P3275

題目描述 幼兒園裡有n個小朋友,1xhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候lkhgww需要滿足小朋友們的k個要求。幼兒園的糖果總數是有限的,1xhgww想知道他至少需...

《差分約束》luogu 3275 糖果

去題面的傳送門 對於題目中的各種條件 a b 建邊a b 0,b a 0 a b 建邊 b a 0 a b 建邊b a 1 為什麼呢?因為要求最少糖果數,那麼對於a b和a b的情況,就都讓它們相差的最少,就是0,對於a b,差的最少就是1,所以建邊為1.由於糖果數量最少的人的糖果至少也得有乙個,所...

luogu 3275 題解 糖果 差分約束

題面 大意 emmmmmmmm看到題面就知道真的不好總結。差分約束的裸題。將各類關係建成不同的邊。當op為1的時候,建乙個雙向邊權值為0 為2的時候,建立從a到b權值為1的邊 為3的時候,建立從b到a權值為0的邊 為4的時候建立從b到a權值為1的邊 為5的時候建立從a到b權值為0的邊 然後直接跑sp...