BZOJ 2330 SCOI 2011 糖果 差分约束系统

题目大意:幼儿园老师给小盆友们发糖果。有5种要求,问老师最少需要准备多少糖果。如不能满足,输出-1。

思路:裸地差分约束系统,但是正向加边会T,需要反向加边。

CODE:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 400010
using namespace std;

int points,asks;
int head[MAX],total;
int next[MAX],aim[MAX],length[MAX];

int f[MAX],showed_time[MAX];
bool v[MAX];

inline void Add(int x,int y,int len)
{
	next[++total] = head[x];
	aim[total] = y;
	length[total] = len;
	head[x] = total;
}

bool SPFA()
{
	static queue<int> q;
	while(!q.empty())	q.pop();
	q.push(0);
	memset(f,0xef,sizeof(f));
	f[0] = 0;
	while(!q.empty()) {
		int x = q.front(); q.pop();
		v[x] = false;
		for(int i = head[x]; i; i = next[i])
			if(f[aim[i]] < f[x] + length[i]) {
				f[aim[i]] = f[x] + length[i];
				if(!v[aim[i]]) {
					v[aim[i]] = true;
					q.push(aim[i]);
					showed_time[aim[i]] = showed_time[x] + 1;
					if(showed_time[aim[i]] > points + 1)
						return false;
				}
			}
	}
	return true;
}

int main()
{
	cin >> points >> asks;
	for(int i = points; i; --i)	Add(0,i,1);
	for(int flag,x,y,i = 1; i <= asks; ++i) {
		scanf("%d%d%d",&flag,&x,&y);
		if(flag == 1)	Add(x,y,0),Add(y,x,0);
		if(flag == 2)	Add(x,y,1);
		if(flag == 3)	Add(y,x,0);
		if(flag == 4)	Add(y,x,1);
		if(flag == 5)	Add(x,y,0);
	}
	if(!SPFA()) {
		puts("-1");
		return 0;
	}
	long long ans = 0;
	for(int i = 1; i <= points; ++i)
		ans += f[i];
	cout << ans << endl;
	return 0;
}

时间: 2024-10-06 00:31:01

BZOJ 2330 SCOI 2011 糖果 差分约束系统的相关文章

BZOJ 2330 SCOI 2011 糖果

2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友

BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status][Discuss] Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果

bzoj 2330: [SCOI2011]糖果 差分约束系统

题意:幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求. 分析:很明显的差分约束系统. 由于是求最小值,所以就要把所有不等式都转换成x-y>=k的形式然后连一条y->x权值为k

【bzoj2330】[SCOI2011]糖果 差分约束系统

题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求. 输入 输入的第一行是两个整数N,K. 接下来K行,表示这些点需要满足的关系,每行3个数字,X,A,B. 如果X=1,

[SCOI 2011]糖果

Description 题库链接 给出 \(N\) 个节点,节点有正点权, \(K\) 个三元组 \((X,A,B)\) 来描述节点点权之间的关系. 如果 \(X=1\) , 表示 \(A\) 的点权必须和 \(B\) 的点权相等: 如果 \(X=2\) , 表示 \(A\) 的点权必须小于 \(B\) 的点权: 如果 \(X=3\) , 表示 \(A\) 的点权必须不小于 \(B\) 的点权: 如果 \(X=4\) , 表示 \(A\) 的点权必须大于 \(B\) 的点权: 如果 \(X=5\

CDOJ 435 (SCOI 2011) 糖果 Label:差分约束系统

糖果 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 131072/131072KB (Java/Others) Submit Status 幼儿园里有NN个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求.幼儿园的糖果总是有限的,lxhgww想知道他至少需

解题:SCOI 2011 糖果

题面 能把差分约束卡死的题,因为正解并不是差分约束 1 #include<queue> 2 #include<cstdio> 3 #include<cctype> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int N=100005; 8 int p[N],noww[2*N],goal[2*N],val[2*N]; 9 int vis[N],in

BZOJ 2333 SCOI 2011 棘手的操作 可并堆

做此题的原因 题号美 题目大意 给出一个序列,支持一堆操作(具体看下面).让你维护它. 思路 U x y:我们需要可并堆来将两个堆合并. A1 x v:将这个点从堆中拽出来,改了之后再合并回去. A2 x v:在堆顶打标记. A3:记录一个全局变量记录. F1 x:将这个点到堆顶的链上的所有标记下传,之后返回自己的大小. F2 x:返回堆顶. F3:用一个堆(set也行)维护所有堆顶的元素.需要仔细讨论一下. CODE #define _CRT_SECURE_NO_WARNINGS #inclu

初涉差分约束系统

一个把数学问题转化为图论模型的很好的例子 差分约束系统 差分约束系统的定义是:一个由$n$个变量和$m$个约束条件组成,形成$m$个形如$x_i-x_j≤k$的不等式($i,j∈[1,n],k$为常数)的系统. 举个例子(图自网络): 例如这个不等式组就是一个差分约束系统. 我们要求的通常是附加几个条件之后(例如$x_i>0$)的这个系统的最大/小解.因为很容易发现,若只有变量之间的相对限制,这个系统要么是无数解:要么是无解. 那么怎么把这个抽象的不等式组化为图论模型呢? 观察一下这个例子(图仍