description
幼兒園裡有n
個小朋友,
lxhgww
老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,
lxhgww
需要滿足小朋友們的
k個要求。幼兒園的糖果總是有限的,
lxhgww
想知道他至少需要準備多少個糖果,才能使得每個小朋友都能夠分到糖果,並且滿足小朋友們所有的要求。
input
輸入的第一行是兩個整數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個小朋友分到的糖果;
output
輸出一行,表示lxhgww
老師至少需要準備的糖果數,如果不能滿足小朋友們的所有要求,就輸出-1。
sample input
5 71 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
sample output
11
hint
【資料範圍】
對於30%的資料,保證 n<=100
對於100%的資料,保證 n<=100000
對於所有的資料,保證 k<=100000,1<=x<=5,1<=a, b<=n
差分約束
1.如果
要求最大
值,把不等式
變為標準
x-y<=
k 的形式,然後
建立一條從y到
x的k邊,求出
最短路徑即可
如果要求最小值的話,變為
x-y>=k
的標準形式
,然後建立一條從y到
x的k邊,求出最長路徑即可
然後建立一條從y到
x權值為k的
邊 如果是
<
號 不是
<= 呢?
x-y=>x-y<=
k-1
2.如果a
同理a<=b,則a到b有一條權值為0的邊 or b到a有一條權值為0的邊。
如果a=b,則a到b有一條權值為0的邊 and b到a有一條權值為0的邊。
ps:正解應該是跑最長路 但我這跑的最短路 。
#include
#include
#include
#include
using
namespace std;
int v,e,s,z,tot;
const
int manx=
2333333
;int first[manx],next[manx],dis[manx];
bool used[manx];
struct
edge
es[manx*2];
void
build
(int ff,
int tt,
int dd)
; next[tot]=first[ff];
first[ff]=tot;
}deque <
int> q;
int tim[
2333333
];bool
spfa
(int s)
else
q.push_back
(v);}}
}}return
false;}
intmain
()else
if(xx==2)
build
(a,b,1);
else
if(xx==3)
build
(b,a,0);
else
if(xx==4)
build
(b,a,1);
else
if(xx==5)
build
(a,b,0);
}for
(int i=v;i>=
1;i--)
build(0
,i,1
); / /使所有圖都連通 1呢是每個人至少都有乙個if(
spfa(0
)==0
)else
puts
("-1"
);return0;
}
差分約束 糖果
幼兒園裡有 n 個小朋友,老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,老師需要滿足小朋友們的 k 個要求。幼兒園的糖果總是有限的,老師想知道他至少需要準備多少個糖果,才能使得每...
差分約束 糖果
幼兒園裡有 nn 個小朋友,老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,老師需要滿足小朋友們的 kk 個要求。幼兒園的糖果總是有限的,老師想知道他至少需要準備多少個糖果,才能使...
差分約束 糖果
幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhgww想知道他至少需要準備多...