分糖果 差分約束
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 7
1 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<k =>x-y<=k-1
2.如果a<b,則a+1<=b, 則a到b有一條權值為1的邊 or b到a有一條權值為-1的邊。(建圖之間正的或負的只建一種!!!)
同理a<=b,則a到b有一條權值為0的邊 or b到a有一條權值為0的邊。
如果a=b,則a到b有一條權值為0的邊 and b到a有一條權值為0的邊。
PS:正解應該是跑最長路 但我這跑的最短路 。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int V,E,s,z,tot;
const int manx=2333333;
int first[manx],next[manx],dis[manx];
bool used[manx];
structedge
{
int from;
int to;
int d;
}es[manx*2];
void build(int ff,int tt,int dd)
{
es[++tot]=(edge){ff,tt,dd};
next[tot]=first[ff];
first[ff]=tot;
}
deque <int> q;
int tim[2333333];
bool spfa(int s)
{
dis[s]=0;
q.push_front(s);
used[s]=1;
while (!q.empty())
{
int u=q.front();
q.pop_front();
used[u]=0;
for(int i=first[u];i!=0;i=next[i])
{
int v=es[i].to;
if(dis[v]<dis[u]+es[i].d)
{
dis[v]=dis[u]+es[i].d;
if(used[v]==0)
{
tim[v] = tim[u] + 1;
if(tim[v] > V)
return true;
used[v]=1;
if(!q.empty())
{
if(dis[v]>dis[q.front()])
q.push_front(v);
else
q.push_back(v);
}
else
q.push_back(v);
}
}
}
}
return false;
}
int main()
{
scanf("%d%d",&V,&E);
tot = 0;
for(int i=1;i<=E;i++)
{
int a,b,xx;
scanf("%d%d%d",&xx,&a,&b);
if(xx==1) / /重點在建圖
{
build(a,b,0);
build(b,a,0);
}
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)
{
long long ans=0;
for(int i=1;i<=V;i++)
ans+= dis[i];
cout<<ans<<endl;
}
else
puts("-1");
return 0;
}
相關推薦
分糖果 差分約束
Description 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖
[BZOJ2330][SCOI2011]糖果 差分約束系統+最短路
題目中的 con blog problem 鏈接 cst pop zoj inline 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 類似於題目中這種含有不等式關系,我們可以建立差分約束系統來跑最長路或
bzoj2330糖果——差分約束
{} 什麽 bool href ble AR pre max 題目 題目:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分約束,再建立一個源點0,向所有點連邊權為1的邊,表示每個人都會分到糖果; 答案較大,需要
洛谷P3275 [SCOI2011]糖果 [差分約束系統]
c++ mes line blank num problem 輸入輸出格式 分析 reg 題目傳送門 糖果 題目描述 幼兒園裏有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如
【題解】洛谷P3275(bzoj2330)[SCOI2011]糖果 差分約束
題目連結 設每個小朋友得到的糖果數為 ccc {x=1ca−cb≥0且cb−ca≥0x=2cb−ca≥1x=3ca−cb≥0x=4ca−cb≥1x=5cb−ca≥0\begin{cases}x=1\quad c_a-c_b\geq0且c_b-c_a\geq
【bzoj 2330】[SCOI2011]糖果 差分約束
連差分約束不知道是什麼的:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 假設 需要滿足條件: b-a<=k1 (
【BZOJ2330】【SCOI2011】糖果——差分約束系統+tarjan
題目連結 差分約束 這是一道經典的差分約束問題 我們假設最後第i個小朋友分得的糖果數為ai,ai∈N∗ 那麼對於約束條件:i分得的糖果少於j的,有ai<aj,由於ai是整數,可以變形為ai⩽aj+(−1) 同樣,對於ai⩽aj也可以看成a
BZOJ 2330 SCOI2011 糖果 差分約束
題目大意:給定n個點和之間的大小關係,求每個點最少是多少(必須大於0) 差分約束系統,按照題目說的連邊即可,記住少於和不少於的大小關係是不一樣的 邊集要開3倍 此外注意的是0到i的連邊要從後往前連 不然TLE 坑B資料逗死我了 #include<queue> #
bzoj 2330: [SCOI2011]糖果 差分約束系統
題意:幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果
[BZOJ2330] [SCOI2011] 糖果 [差分約束][單源最短路][縮點][拓撲排序]
link SPFA 題目要求求最小值。 建原點0\mathfrak{0}0,也就是要∑dis[x]−dis[0]\mathfrak{\sum{dis[x]-dis[0]}}∑dis[x]−dis[0] 最小。 最小值受到dis[x]−dis[0]≥val[x
BZOJ2330 [SCOI2011]糖果 差分約束模板
很久以前學的差分約束,基本忘了,複習一下 a<=b+c,ins(b,a,c)是最短鏈,每個元素最大 a>=b+c,ins(b,a,c)是最長鏈,每個元素最小 #include<bits/stdc++.h> #pragma comment(link
BZOJ 2330 [SCOI2011]糖果 差分約束系統
#include <cstdio> #include <cstring> #include <queue> #define N 100005 using namesp
BZOJ[2330]糖果 差分約束
Description 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的
2330: [SCOI2011]糖果 (差分約束系統)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cm
bzoj 2330 糖果 差分約束
#include<iostream> #include<cstdio> #include<queue> using namespace std; struct bia
[luoguP3275] [SCOI2011]糖果(差分約束)
cli open inline none long cst aps ret 糖果 傳送門 差分約束裸題 但是坑! 有一個點是長為10W的鏈,需要逆序加邊才能過(真是玄學) 還有各種坑爹數據 開longlong ——代碼
【差分約束】SCOI2011糖果 P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 快noip了我還在幹什麼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 來我們看這道題 根據條件建圖, 因為求得是最小值, 所以要跑最長路qwq(這是我記住的QAQ 不想寫了讓我們直接看看題解吧! P3275 [SCOI2011]糖果(five20的題解) 有環
【差分約束】SCOI2011糖果
from line esp har org alt ans img i++ P3275 [SCOI2011]糖果 快noip了我還在幹什麽啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 來我們看這道題 根據條件建圖, 因為求得是最小值, 所以要跑最長路qwq(這是我記住
bzoj2330: [SCOI2011]糖果 (利用差分約束系統將之轉換成最長路的問題)
問題 時間限制 接下來 show ems 輸入 als include while 題目 2330: [SCOI2011]糖果 時間限制: 10 Sec 內存限制: 128 MB 題目描述 幼兒園裏有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖
洛谷P3275 [SCOI2011]糖果_差分約束_判負環
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; const int N=300000+3; const int I