BZOJ2330 SCOI2011糖果 差分約束

2021-07-01 22:13:29 字數 1098 閱讀 3460

差分約束題。。學了一下差分約束,我覺得還是挺簡單的,考慮f[u]-f[v]<=c,發現和最短路的鬆弛操作神似,最短路跑完之後對於一條邊(v,u),顯然有d[u]<=d[v]+c,不就是上面差分約束的式子嗎。。那就轉化成最短(長)路做咯,以最短路為例了,對於每個f[u]-f[v]<=c,連一條v到u權值為c的邊,然後跑最短路,如果有負環那就說明無解,沒有的話跑完之後各點的d值就是解。。

對於本題,d[a]==d[b],有d[a]-d[b]>=0, d[b]-d[a]>=0

d[a],有d[b]-d[a]>=1

d[a]>=d[b],有d[a]-d[b]>=0

d[a]>d[b],有d[a]-d[b]>=1

d[a]<=d[b],有d[b]-d[a]>=0

這裡要求一組和最小的解,而每個點要》=1,所以用最長路做,每個點初始賦為1,然後一開始把它們都扔進佇列,跑最長路即可。。

對於差分約束來說,無論跑最長路還是最短路都可以出解,但是我們求出的都只是一組相對大小,要利用這個相對大小來求一組符合題目的解。。像這題,每個點的值要求大於0,所以我們賦初值1,要保證在執行演算法的過程中每個點的值始終大於0,那麼就是跑最長路了。。

#include#include#include#define n 100005

using namespace std;

struct edgeed[n*2];

int n,k,i,s,t,opt,ne=0,a[n],dis[n],que[n*2],u[n],inq[n];

long long ans=0ll;

void add(int s,int e,int q)

bool spfa()

}inq[get]=0;

} return true;

}int main()

add(s,t,1);break;

case 3:add(t,s,0);break;

case 4:if (s==t)

add(t,s,1);break;

case 5:add(s,t,0);break;

} }if (spfa())

else printf("-1");

}

BZOJ 2330 差分約束系統

差分約束系統是用最短路的三角不等式來得到題目中給定的不等式的一組解,具體來說,最短路中的不等式為if dis v dis u len p dis v dis u len p 假設題目中給定不等式a b 5,那麼轉換的不等式即為if dis a dis b 5 dis a dis b 5,這樣就把數學...

bzoj2330 差分約束 糖果

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

BZOJ 2330 差分約束系統

傳送門 差分約束這裡做個簡單介紹 形如 x i x j d 的不等式,可以聯想到我們求最短路時 d v d u len 則上式可以變形為 x i x j d 即連一條j i的長度為d的邊並跑最長路,dis i 則是滿足條件的最小解 因為上面等式採用的 號,所以求出的時最小解,同理當變形為 x j x...