《差分約束》luogu 3275 糖果

2021-08-10 00:01:33 字數 1155 閱讀 3241

去題面的傳送門

對於題目中的各種條件:

① 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.

由於糖果數量最少的人的糖果至少也得有乙個,所以建乙個超級原點,到所有點的權值為1,然後跑最長路。因為對於乙個學生的糖果數量,要盡可能滿足所有人的要求。如果存在最長路,那麼該同學的糖果數就能更滿足其他較短路上的人的要求,所以最長路實際上求的是最小值。

不滿足條件的情況,就是形成了正環。所以spfa判一下正環就好了

**:

#include

#include

#include

#include

#include

using

namespace

std;

const

long

long maxn=200000+10;

long

long n,k,cnt,ans;

long

long fist[maxn],tot[maxn],nxt[maxn<<1],dis[maxn];

bool vis[maxn];

struct hh

e[maxn<<1];

deque

long>q;

void build(long

long f,long

long t,long

long v)

; nxt[cnt]=fist[f];

fist[f]=cnt;

}bool spfa()

}if(tot[v]>=n+3) return

false;}}

return

true;

}int main()

for(long

long i=1;i<=n;++i) build(n+1,i,1);

if(!spfa()) printf("-1");

else

return

0;}

luogu 3275 題解 糖果 差分約束

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

差分約束 糖果

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

差分約束 糖果

幼兒園裡有 nn 個小朋友,老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,老師需要滿足小朋友們的 kk 個要求。幼兒園的糖果總是有限的,老師想知道他至少需要準備多少個糖果,才能使...