1. 程式人生 > >【BZOJ2330】【SDOI2012】糖果(差分約束,SPFA)

【BZOJ2330】【SDOI2012】糖果(差分約束,SPFA)

【BZOJ2330】【SDOI2012】糖果

題面

題目描述

幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的K個要求。幼兒園的糖果總是有限的,lxhgww想知道他至少需要準備多少個糖果,才能使得每個小朋友都能夠分到糖果,並且滿足小朋友們所有的要求。
輸入輸出格式
輸入格式:

輸入的第一行是兩個整數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 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1

輸出樣例#1

11

說明

【資料範圍】

對於30%的資料,保證 N<=100

對於100%的資料,保證 N<=100000

對於所有的資料,保證 K<=100000,1<=X<=5,1<=A, B<=N

題解

差分約束大火題模板題
對於每個操作直接建邊
然後跑SPFA即可

#include<iostream>
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<stack> #include<map> #include<vector> #include<queue> using namespace std; #define MAX 110000 int n; inline int read() { int x=0
,t=1;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t; } struct Line { int v,next,w; }e[MAX<<1]; int h[MAX],cnt=1; inline void Add(int u,int v,int w) { e[cnt]=(Line){v,h[u],w}; h[u]=cnt++; } int dis[MAX],InQ[MAX]; bool vis[MAX]; queue<int> Q; void SPFA() { bool FL=true; for(int i=1;i<=n;++i) dis[i]=InQ[i]=vis[i]=1,Q.push(i); while(!Q.empty()) { int u=Q.front();Q.pop(); for(int i=h[u];i;i=e[i].next) { int v=e[i].v; int w=dis[u]+e[i].w; if(dis[v]<w) { dis[v]=w; if(!vis[v]) { vis[v]=true,Q.push(v),InQ[v]++; if(InQ[v]>=n) { FL=false; break; } } } } if(!FL)break; vis[u]=false; } if(!FL) { printf("-1\n"); return; } long long ans=0; for(int i=1;i<=n;++i)ans+=dis[i]; printf("%lld\n",ans); } int main() { n=read();int K=read(); int X,u,v; while(K--) { X=read();u=read();v=read(); if(X==1){Add(u,v,0);Add(v,u,0);} else if(X==2){Add(u,v,1);} else if(X==3){Add(v,u,0);} else if(X==4){Add(v,u,1);} else if(X==5){Add(u,v,0);} if(!(X&1)&&u==v) { printf("-1\n"); return 0; } } SPFA(); return 0; }

相關推薦

BZOJ2330SDOI2012糖果約束SPFA

【BZOJ2330】【SDOI2012】糖果 題面 題目描述 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在

POJ3169Layout約束系統+SPFA

題目連結 Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions:14919 Accepted: 7183 Description Like everyone

洛谷3275[SCOI2011] 糖果約束系統入門題

點此看題面 大致題意: 有\(N\)個小朋友,要求每個人都得到糖果,且每個人的糖果總數滿足一定的關係式,請你求出至少共分給小朋友們多少糖果。 關係式的轉換 首先,我們可以將題目中給定的式子進行轉換: \(A=B\):這個式子可以拆成\(A≥B\)和\(B≥A\),再轉換一下就變成了\(A-B

題解 [HNOI2005]狡猾的商人約束

AD sca main pop namespace 數組 names ace line 題面懶得復制,戳我戳我 Solution: 其實這個差分是挺顯然的,我們可以用\(s[i]\)表示從第\(1\)到\(i\)中間的收入和 重點就在式子,比如讀入\(a\),\(b\),

[BZOJ2330][SCOI2011]糖果約束

題目描述 傳送門 題解 差分約束系統,模型是很好建的,求最小值轉化成跑最長路。 把大於小於號都轉化為大於等於和小於等於。對於x=1的情況建立2個不等式就可以解決。 想著剛碼完資料結構就挑了

bzoj2330糖果約束

題目描述 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配

[luoguP3275] [SCOI2011]糖果約束

cli open inline none long cst aps ret 糖果 傳送門 差分約束裸題 但是坑! 有一個點是長為10W的鏈,需要逆序加邊才能過(真是玄學) 還有各種坑爹數據 開longlong ——代碼

bzoj 2330: [SCOI2011]糖果約束

2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5172  Solved: 1658 [Submit][Sta

SCOI2011 糖果約束

【題目描述】 幼兒園裡有N個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的K個要求。幼兒園的糖果總是有

POJ 1201 Intervals約束系統

sub 代碼 idt ear ces oid std one space 【POJ 1201】 Intervals(差分約束系統) 11 1716的升級版 把原本固定的邊權改為不固定。 Intervals Time Limit: 2000MS Memor

POJ 1716Integer Intervals約束系統

入門題 put AD edge ota 全部 lib 最小 最短 id=1716">【POJ 1716】Integer Intervals(差分約束系統) In

BZOJ1998[HNOI2010]物品調度並查集模擬

turn show else int 維護 sin size problem pro 【BZOJ1998】[HNOI2010]物品調度(並查集,模擬) 題面 BZOJ,為啥這題都是權限題啊? 洛谷 題解 先不管\(0\)位置是個空,把它也看成一個箱子。那麽最終的答案顯然和置

CCF 201809-4再買菜約束/DP

題意 問題描述   在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。   第一天,每個商店都自己定了一個正整數的價格。店主們希望自己的菜價和其他商店的一致,第二天,每一家商店都會根據他自己和相鄰商店的價格調整自己的價格。具體的,每家商店都會將第二

Learning Notes生成式對抗網路Generative Adversarial NetworksGAN

在學習 Variational Auto-Encoder時,同時注意到了 GAN 研究的火熱。但當時覺得 GAN 非常不成熟(訓練不穩定,依賴各種說不清的 tricks;沒有有效的監控指標,需要大量的人工判斷,因此難以擴展到圖像之外的高維數據)。在讀了 Good

POJ 3159 Candies約束系統

During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of can

2631Roads in the North 樹的直徑模板

題幹: Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build su

HDOJ題目3440 House Man約束

etop log help crazy code sizeof inpu field empty House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/

POJ 3159 Candies約束+spfa+鏈式前向星

void tdi div con pre ace != view ash 題目鏈接:http://poj.org/problem?id=3159 題目大意:給n個人派糖果,給出m組數據,每組數據包含A,B,C三個數,意思是A的糖果數比B少的個數不多於C,即B的糖果數 -

bzoj3436: 小K的農場約束

col bsp pac als OS namespace mat else center 3436: 小K的農場 題目:傳送門 題解:   查分基礎:    t==1 a>=b+c    t==2 b>=a-c   t==3 a>=b+

bzoj1202: [HNOI2005]狡猾的商人約束

urn scan space 等於 -a OS 吐槽 set blank 1202: [HNOI2005]狡猾的商人 題目:傳送門 題解:   據說是帶權並查集!蒟蒻不會啊!!!    可是聽說lxj大佬用差分約束A了,於是開始一通亂搞。    設s[i]為前i個