1. 程式人生 > >分糖果 差分約束

分糖果 差分約束

Description

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

Input

輸入的第一行是兩個整數NK

接下來K行,表示這些點需要滿足的關係,每行3個數字,XAB

如果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 的形式然後建立一條從yxk邊,求出最短路徑

如果要求最小值的話,變為x-y>=k的標準形式,然後建立一條從yxk邊,求出最長路徑即

然後建立一條從yx權值為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