【題目描述】:
幼兒園裡有n個小朋友,1xhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候lkhgww需要滿足小朋友們的k個要求。幼兒園的糖果總數是有限的,1xhgww想知道他至少需要準備多少個糖果,才能使得每個小朋友都能夠分到糖果,並且滿足小朋友們所有的要求。
ps:出題人/搬題人太毒,建圖順序不對會導致#5會tle/wa。。。
【輸入描述】:
輸人的第一行是兩個整數n,k。
接下來k行,表示這些點需要滿足的關係,每行3個數字,x,a,b。
如x=1,表示第a個小朋友分到的糖果必須和第b個小朋友分到的糖果一樣多。
如x=2,表示第a個小朋友分到的糖果必須少於第b個小朋友分到的糖果。
如x=3,表示第a個小朋友分到的糖果必須不少於第b個小朋友分到的糖果。
如x=4,表示第a個小朋友分到的糖果必須多於第b個小朋友分到的糖果。
如x=5,表示第a個小朋友分到的糖果必須不多於第b個小朋友分到的糖果。
【輸出描述】:
輸出一行,表示lxhgww老師至少需要準備的糖果數,如果不能滿足小朋友們的所有要求,就輸出-1。
【樣例輸入】:
5 71 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
【樣例輸出】:
【時間限制、資料範圍及描述】:
對於30%的資料,保證n<=100。
對於100%的資料,保證n<=100,000。
對於所有的資料,保證k<=100,000;1<=x<=5;1<=a,b<=n。
思路
注意要用longlong,還要特判-1的情況
">#include#include#includeusing namespace std;
const int n=1000005;
int n,tt,h[n],hh[n],to[n],cnt,w[n],dis[n],tot[n];
bool vis[n];
queueq;
long long ans;
void add(int u,int v,int c)
void spfa()
tot[u]++;
for(int i=h[u];i;i=hh[i])
q.push(to[i]);
}}
}}int main()
if(x==2)
add(u,v,1);
}if(x==3)
add(v,u,0);
if(x==4)
add(v,u,1);
}if(x==5)
add(u,v,0);
}for(int i=1;i<=n;i++)
add(0,i,1);
spfa();
for(int i=1;i<=n;i++)
ans+=dis[i];
printf("%lld",ans);
return 0;
}
洛谷P3275 糖果 差分約束 負環
有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需要...
題解 洛谷P3275 SCOI2011 糖果
一道條件非常多的差分約束 把 a b 轉化為 a b le 1 就可做了 a b 的情況同理 若有負環則無解輸出 1 注意本題中要求每個人都有糖果 所以假設乙個源點 d 使 d d ge 1 1 le i le n 另外,本題要求得是最小值 x x le a 的形式求出的是最大值 要轉化成 x x ...
題解 洛谷P3275 SCOI2011 糖果
題面 其實是裸的差分約束吧 qwq。對於每一種情況分類討論一下 這裡說一下差分約束最基本的建圖方式 如何求最值呢?結論 如果求的是最小值,那麼我們就跑一遍最長路 否則就跑一遍最短路。具體的方法就是對於每乙個 x i geq c 的條件,建立乙個超級源點 0 由 0 向 x i 連一條長度為 c 的邊...