BZOJ2330 糖果题解 查分约束
BZOJ 2330 糖果题解
差分约束系统 + SPFA
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2330
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
—————————————————————————分割线———————————————————————
将不等式问题转化为图论问题,这里用SPFA 算法解决最长路。
裸题一道,不做过多解释。
代码如下:
/**************************************************************
Problem: 2330
User: shadowland
Language: C++
Result: Accepted
Time:220 ms
Memory:13600 kb
****************************************************************/ #include "bits/stdc++.h" using namespace std ;
const int maxN = ;
typedef long long QAQ ; struct Path {
int to , next , w ;
}e[ maxN<< ];
int Dis[ maxN ] , In [ maxN ] ,p[ maxN ] ;
bool visited [ maxN ] ; int cnt , N , M ;
QAQ ans ; int INPUT()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void Add_Edge( const int x , const int y , const int z )
{
e[ ++cnt ] . to = y ;
e[ cnt ] . next = p[ x ] ;
e[ cnt ] . w = z ;
p[ x ] = cnt ;
return ;
}
bool SPFA ( const int S )
{
int i , t , temp ;
queue <int> Q;
memset( visited , , sizeof ( visited ) ) ;
memset( Dis , , sizeof ( Dis ) ) ;
memset( In , , sizeof ( In ) ) ;
Q.push( S ) ;
visited[ S ] = true ;
Dis[ S ] = ;
while( !Q.empty( ) )
{
t = Q.front( ) ;Q.pop( ) ;visited[ t ] = false ;
for( i=p[t] ; i ; i = e[ i ] . next )
{
temp = e[ i ].to;
if(Dis[ temp ] < Dis[ t ] + e[ i ].w)
{
Dis[ temp ] = Dis[ t ] + e[ i ] . w ;
if( !visited[ temp ] )
{
Q.push( temp ) ;
visited[ temp ] = true ;
if( ++In[temp] > N ) return false ;
} }
}
}
return true ;
}
int main ( ) {
N = INPUT ( ) ;
M = INPUT ( ) ;
for ( int i= ; i<=M ; ++i ) {
int _ , x , y ;
_ = INPUT ( ) ;x = INPUT ( ) ;y = INPUT ( ) ;
if ( _ == ){
Add_Edge ( x , y , ) ;
Add_Edge ( y , x , ) ;
}else
if ( _== ) {
if ( x==y ) goto Fail ;else
Add_Edge ( x , y , ) ;
}else
if ( _== ) {
Add_Edge ( y , x , ) ;
}else
if ( _== ) {
if ( x==y ) goto Fail ; else
Add_Edge ( y , x , ) ;
}else
{
Add_Edge ( x , y , ) ;
}
}
for ( int i=N ; i>= ; --i )
Add_Edge ( , i , ) ;
if ( !SPFA ( ))goto Fail ;
for ( int i= ; i<=N ; ++i ) {
ans += Dis [ i ] ;
}
printf ( "%lld\n" , ans ) ;
goto End ;
Fail:
printf ( "-1\n" ) ;
End:
return ;
}
2016-09-14 18:14:40
(完)
BZOJ2330 糖果题解 查分约束的更多相关文章
- 洛谷P1993 小 K 的农场(查分约束)
/* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...
- codevs 1242 布局(查分约束+SPFA)
/* 查分约束. 给出的约束既有>= 又有<= 这时统一化成一种 Sb-Sa>=x 建边 a到b 权值为x Sb-Sa<=y => Sa-Sb>=-y 建边 b到a ...
- poj 1201 Interval (查分约束)
/* 数组开大保平安. 查分约束: 输入的时候维护st和end 设每个点取元素di个 维护元素个数前缀和s Sbi-Sai-1>=ci 即:建立一条从ai-1到bi的边 权值为ci 表示ai到b ...
- POJ1364基本的查分约束问题
题意: 给了由n个数组成的一个数列,然后给你各种区间的和是大于ci还是小于ci啥的,最后问你是否冲突. 思路: 差分约束水题,不过wa了两次,原因处理区间问题的细节马虎了,说下 ...
- POJ1094查分约束,判断关系是否唯一
题意: 给你一些a<b的关系,然后有三组询问. 1 当前这组之后如果能确定这n个数的大小关系,那么就输出关系 2 当前时候出现bug,就是和前面如果冲突,那么就不行 3 最后的答案是 ...
- zoj Burn the Linked Camp (查分约束)
Burn the Linked Camp Time Limit: 2 Seconds Memory Limit: 65536 KB It is well known that, in the ...
- poj 1364 查分约束
#include<stdio.h> #include<iostream> #include<stack> #include<string.h> usin ...
- hdu 1384 查分约束
#include<stdio.h> /* 要善于挖掘隐含条件 dis[v]-dis[u]>=bian[i].w;一个条件(u,v,bian[i].w); dis[i+1]>=d ...
- Integer Intervals POJ - 1716_查分约束_
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
随机推荐
- MongoDB增删查改
1.insert db.Customers.insert({ "DateTest":new Date(), "IntTest":32, "Double ...
- Delphi中弹出提示框的四种方法
参考:http://blog.itpub.net/8432156/viewspace-924843/ 更为详细的内容请参见:http://blog.csdn.net/akof1314/article/ ...
- Pyqt QSplashScreen启动画面
多大数应用程序启动时都会在程序完全启动时显示一个启动画面,在程序完全启动后消失.程序启动画面可以显示一些有关产品的信息,让用户在等待程序启动的同时了解有关产品的功能,也是一个宣传的方式.QSplash ...
- Python win32api提取exe图标icon
转载地址: http://blog.csdn.net/gumanren/article/details/6129416 代码如下: # -*- coding: utf-8 -*- import sys ...
- 【转载】 Python 方法参数 * 和 **
Python的函数定义中有两种特殊的情况,即出现*,**的形式. 如:def myfun1(username, *keys)或def myfun2(username, **keys)等. 他们与函数有 ...
- POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)
曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x ...
- canvas之2D上下文
1.填充和描边 (1)fillStyle (2)strokeStyle 2.绘制矩形 (1)fillRect() (2)strokeRect() (3)clearRect() :清除画布上的矩形区 ...
- PHP入门 - - 05-->编写HTML页面的常用标签
一.文字版面的编辑 1.格式标签 格式标签用于定义网页中文本的布局.缩进.位置.换行.列表等 <br> 换行 <p> ...
- POJ1201 Intervals差分约束系统(最短路)
Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p ...
- zoj 3469 Food Delivery 区间dp + 提前计算费用
Time Limit: 2 Seconds Memory Limit: 65536 KB When we are focusing on solving problems, we usual ...