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 ...
随机推荐
- 设计模式学习之适配器模式(Adapter,结构型模式)(14)
参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...
- poj 1006:Biorhythms(水题,经典题,中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 110991 Accepted: 34541 Des ...
- Linux發送郵件
1.直接使用shell當編輯器 [root@phburdb1 mail]# mail -s "Hello World" juncai.chen@innolux.comHello j ...
- C程序设计语言习题解答
1-6 #include <stdio.h> int main(void) { printf("getchar()!=EOF is:%d\n", getchar()!= ...
- 第十五篇:在SOUI中消息通讯
SOUI是一套基于Win32 SDK的窗口开发的一套DirectUI框架.在SOUI中除了有真窗口使用窗口消息通讯机制外,还有SOUI控件之间的通讯,及控件的事件处理等. 1.真窗口消息通讯 因此可以 ...
- 原生JavaScript 全特效微博发布面板效果实现
javaScript实现微博发布面板效果.---转载白超华 采用的js知识有: 正则表达式区分中英文字节.随机数生成等函数 淡入淡出.缓冲运动.闪动等动画函数 onfocus.onblur.oninp ...
- Java学习笔记(九)——继承
一.继承 1.概念: 继承是类于类之间的关系,是一种"is a "的关系 Ps: Java是单继承 2.优势: (1)子类直接拥有父类的所有属性和方法(除了privata) (2) ...
- CDN网络的原理
来源:http://blog.csdn.net/coolmeme/article/details/9468743 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.用户向浏览器输入www.we ...
- supervisor(一)基础篇
这两天干的活,是让楼主写一个supervisor的listener,用来监控supervisor所管理子进程的状态,当子进程异常退出时,楼主写的这个listener将会触发报警.在这里总结下super ...
- java的几种连接池
连接池的管理用了了享元模式,这里对连接池进行简单设计. 一.设计思路 1.连接池配置属性DBbean:里面存放可以配置的一些属性 2.连接池接口IConnectionPool:里面定义一些基本的获取连 ...