1. 程式人生 > >【bzoj 2330】[SCOI2011]糖果 差分約束

【bzoj 2330】[SCOI2011]糖果 差分約束

連差分約束不知道是什麼的:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html

假設 需要滿足條件:

b-a<=k1     (1)

c-b<=k2     (2)

c-a<=k3     (3)

(1)(2)相加 得到不等式c-a<=k1+k2

所以要使條件滿足的首要條件就是c-a<=min(k1+k2,k3) 但是可能題目中會有多個條件,不過本質並不會改變,依舊是求最小值,那麼我們將a,b,c為點,以k為邊權建邊,得到一個有向圖,求最短路就得到了min;

注意:1.最少每個人分到一個糖果從0填邊的時候邊權為1,而且要從後面向前填邊

            2.最終ans用long long存

#include<cstdio>
#include<cstring>
#define maxn 100020
#include<iostream>
#include<queue>
#define LL long long
using namespace std;
queue<int >q;
int n,m,head[maxn*2],tot,vis[maxn],dis[maxn],times[maxn];
struct edge{
	int v,w,next;
}e[maxn*4];
void adde(int a,int b,int c){e[tot].v=b,e[tot].w=c,e[tot].next=head[a];head[a]=tot++;}

bool spfa(){
	q.push(0),dis[0]=0,times[0]=1;
	while(!q.empty()){
		int u=q.front();q.pop() ;
		vis[u]=0;
		for(int i=head[u];i!=-1;i=e[i].next ){
			int v=e[i].v ,w=e[i].w;
			if(dis[v]<dis[u]+w){
				dis[v]=dis[u]+w;
				times[v]++;
				if(times[v]>=n)return false;
				if(!vis[v]){
					vis[v]=1;
					q.push(v); 
				}
			}
		}
	}
	return true;
}

int main(){
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int pos,b,a,i=1;i<=m;i++){
		scanf("%d%d%d",&pos,&a,&b);
		if(pos==1){adde(a,b,0),adde(b,a,0);}
		else if(pos==2){
			if(a==b){printf("-1");}
			 adde(a,b,1);
		}else if(pos==3){
			adde(b,a,0);
		}else if(pos==4){
			if(a==b){printf("-1");return 0;}
			adde(b,a,1);break;
		}else if(pos==5){
			adde(a,b,0);
		}	
	}
	for(int i=n;i>=1;i--)adde(0,i,1);
	if(!spfa()){printf("-1");return 0;}
	LL ans=0;
	for(int i=1;i<=n;i++)
		ans+=(LL)dis[i];
	printf("%lld",ans);
	return 0;
}/*
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
*/


相關推薦

bzoj 2330[SCOI2011]糖果 約束

連差分約束不知道是什麼的:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 假設 需要滿足條件: b-a<=k1     (

題解洛谷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 糖果 約束

題目大意:給定n個點和之間的大小關係,求每個點最少是多少(必須大於0) 差分約束系統,按照題目說的連邊即可,記住少於和不少於的大小關係是不一樣的 邊集要開3倍 此外注意的是0到i的連邊要從後往前連 不然TLE 坑B資料逗死我了 #include<queue> #

bzoj 2330: [SCOI2011]糖果 約束系統

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

BZOJ 2330 [SCOI2011]糖果 約束系統

#include <cstdio> #include <cstring> #include <queue> #define N 100005 using namesp

2330: [SCOI2011]糖果 (約束系統)

#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cm

POJ 1201 Intervals(約束系統)

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

[BZOJ2330][SCOI2011]糖果 約束系統+最短路

題目中的 con blog problem 鏈接 cst pop zoj inline 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 類似於題目中這種含有不等式關系,我們可以建立差分約束系統來跑最長路或

洛谷P3275 [SCOI2011]糖果 [約束系統]

c++ mes line blank num problem 輸入輸出格式 分析 reg   題目傳送門 糖果 題目描述 幼兒園裏有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

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

BZOJ2330SCOI2011糖果——約束系統+tarjan

題目連結 差分約束 這是一道經典的差分約束問題 我們假設最後第i個小朋友分得的糖果數為ai,ai∈N∗ 那麼對於約束條件:i分得的糖果少於j的,有ai<aj,由於ai是整數,可以變形為ai⩽aj+(−1) 同樣,對於ai⩽aj也可以看成a

BZOJ[2330]糖果 約束

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

bzoj 2330 糖果 約束

#include<iostream> #include<cstdio> #include<queue> using namespace std; struct bia

BZOJ 1045 [HAOI2008] 糖果傳遞

lac efi source span 遞推 所有 ret clu long 【鏈接】 我是鏈接,點我呀:) 【題意】 在這裏輸入題意 【題解】 思路來自hzwer.. 設xi表示第i個人往左傳遞了xi個糖果。 (如果小於0表示旁邊的人給他了糖果。 則ans

POJ3169Layout(約束系統+SPFA)

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

bzoj2330糖果——約束

{} 什麽 bool href ble AR pre max 題目 題目:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分約束,再建立一個源點0,向所有點連邊權為1的邊,表示每個人都會分到糖果; 答案較大,需要

BZOJ 1202 狡猾的商人 約束or帶權並查集

!= pre false 其中 png 超時 差分約束 樹根 cto 題目鏈接: https://www.lydsy.com/JudgeOnline/problem.php?id=1202 題目大意: 刁姹接到一個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬

糖果 約束

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