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 ...
随机推荐
- Java内存泄露的理解与解决
依赖于引用判断的内存管理机制 Java中对内存对象的访问,使用的是引用的方式.在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间.在Ja ...
- 【翻译一】java-并发
Lesson: Concurrency Computer users take it for granted that their systems can do more than one thing ...
- WCF消息拦截,利用消息拦截做身份验证服务
本文参考 http://blog.csdn.net/tcjiaan/article/details/8274493 博客而写 添加对信息处理的类 /// <summary> /// 消 ...
- jQuery实现长按按钮触发事件的方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- WPF PRISM开发入门一( 初始化PRISM WPF程序)
这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在Github上获取PRISM的源码.这个系列的博客将选择PRISM 4. ...
- 优秀的API接口设计原则及方法(转)
一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...
- WCF服务寄宿应用程序
1.先创建一个WCF服务库 2.创建一个Console控制台,服务将寄宿在该应用程序上,该程序一旦关闭,服务将停止. 控制台代码: using System; using System.Collect ...
- 关于移动端1px边框问题
<div class="z_nei_list"> <div class="z_name_left font-size3">身份证号:&l ...
- 【maven】maven各种奇葩问题
问题1:Could not calculate build plan: Plugin org.apache... 不能成功创建maven项目 解决方法1: http://repo1.maven.org ...
- LR Analysis:详解FirstBufferTime
LR Analysis:详解FirstBufferTime 详解 第 一次缓冲时间 测试结果分析过程中,经常遇到第一次缓冲时间 FirstBufferTime,并且发现大 部分系统的响应时间也都浪 ...