幼兒園裡有 n 個小朋友,老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。
但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候, 老師需要滿足小朋友們的 k 個要求。
幼兒園的糖果總是有限的,老師想知道他至少需要準備多少個糖果,才能使得每個小朋友都能夠分到糖果,並且滿足小朋友們所有的要求。
輸入格式
輸入的第一行是兩個整數 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 個小朋友分到的糖果。
小朋友編號從 1 到 n。
輸出格式
輸出一行,表示老師至少需要準備的糖果數,如果不能滿足小朋友們的所有要求,就輸出 −1。
資料範圍
1 ≤n
<
1051≤n<105
1≤n<10
5,1 ≤k
≤105
1≤k≤105
1≤k≤10
5,1 ≤x
≤5
,1≤x≤5,
1≤x≤5,
1 ≤a
,b≤n
1≤a,b≤n
1≤a,b≤
n輸入樣例:
5 71 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
輸出樣例:11i
>=x
j+
cx_i>=x_j+c
xi>=x
j+c
所以我們發掘不等式的時候應該去找大於。連邊的時候應該是j向i連線一條c的邊權。
我們建立乙個超級源點0,每個人的糖果都應該比他大所以表示式應該是x
i>=x
0+
1x_i>=x_0+1
xi>=x
0+1
然後就是審題找不等式關係。
1 ,a
>=b
,b
>=a
1,a>=b,b>=a
1,a>=b
,b>=a
2 ,b
>=a
+1
2,b>=a+1
2,b>=a
+13 ,a
>=b
3,a>=b
3,a>=b
4 ,a
>=b
+1
4,a>=b+1
4,a>=b
+15 ,b
>=a
5,b>=a
5,b>=a
當我們跑完最長路的時候,根據前言中所寫的不等式鏈的關係,我們上界應該是所有的最長路邊權之和。
這裡有乙個非常玄學的東西,我們存在負環的時候用佇列的spfa容易被卡掉,我們這裡採用的是用棧,這個優化不太穩定,比較玄學。優化大致上基於如下想法:如果存在乙個環,那麼用棧來搜尋時,會按照深度優先的順序,那麼很快就會沿著環找到起點。另外,這道題目可以用強聯通分量演算法來做,時間複雜度可以做到 o(n+m)o(n+m)。
#include
#define int long long
using
namespace std;
//typedef pairpp;
const
int n=
3e5+7;
int n,m,vis[n]
,ne[n]
,e[n]
,dis[n]
,w[n]
,head[n]
,cnt,con[n]
;void
add(
int a,
int b,
int c)
bool
spfa()
}}}return1;
}signed
main()
for(
int i=
1;i<=n;i++
)add(0
,i,1);
if(!spfa()
)else
return0;
}
差分約束 糖果
幼兒園裡有 nn 個小朋友,老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,老師需要滿足小朋友們的 kk 個要求。幼兒園的糖果總是有限的,老師想知道他至少需要準備多少個糖果,才能使...
差分約束 糖果
幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhgww想知道他至少需要準備多...
分糖果 差分約束
description 幼兒園裡有n 個小朋友,lxhgww 老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww 需要滿足小朋友們的 k個要求。幼兒園的糖果總是有限的,l...