差分約束系統是用最短路的三角不等式來得到題目中給定的不等式的一組解,具體來說,最短路中的不等式為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,這樣就把數學中的不等式轉換成圖上的路徑關係。每乙個不等式變數的解即為它對應點的dis值。
#include#include#includeusing namespace std;
#define maxn 100005
#define maxq 1000000
int pre[2*maxn],other[2*maxn],last[maxn],len[2*maxn];
int dis[maxn],cnt[maxn],q[maxn*10+5];
int n,m,l;
bool vis[maxn];
long long ans;
void connect(int x,int y,int z)
void spfa(void)
for (int p=last[u];p;p=pre[p])
else }}
} }for (int i=1;i<=n;i++) ans+=dis[i];
printf("%lld\n",ans);
}int main()
if (x==2) connect(a,b,1);
if (x==3) connect(b,a,0);
if (x==4) connect(b,a,1);
if (x==5) connect(a,b,0);
} for (int i=n;i>=1;i--)
spfa();
return 0;
}
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...
bzoj2330 差分約束 糖果
description 幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhgw...
bzoj2330糖果(差分約束)
題目描述 幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhgww想知道他至少...