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

 
/*
差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长路的话变形就行了,即d[v]>=d[u]+w(u, v)。 我们根据本题给的约束可以构造这样的不等式(因为最短路的话是负数,很不好判断,如果化成最长路,就都是正数了): 首先所有的人都满足,d[i]>=1 按照输入a和b d[a]==d[b],有 d[a]-d[b]>=0, d[b]-d[a]>=0 d[a]<d[b],有 d[b]-d[a]>=1 d[a]>=d[b],有 d[a]-d[b]>=0 d[a]>d[b],有 d[a]-d[b]>=1 d[a]<=d[b],有 d[b]-d[a]>=0 然后建图就行。(在这里,不要添加附加源,如果非要加的话逆着添加,因为此题数据可能造了个很大的正环。。
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=, k=; char c=getchar(); for(; c<''||c>''; c=getchar()) if(c=='-') k=-; for(; c>=''&&c<=''; c=getchar()) r=r*+c-''; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=;
int ihead[N], n, m, vis[N], tm[N], cnt, q[N], front, tail;
long long d[N];
struct ED { int to, next, w; } e[];
inline void add(const int &u, const int &v, const int &w) {
e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; e[cnt].w=w;
}
const bool spfa() {
for1(i, , n) q[i]=i, d[i]=, vis[i]=, tm[i]=;
front=; tail=n+;
int u, v;
while(front!=tail) {
u=q[front++]; if(front==N) front=; vis[u]=;
for(int i=ihead[u]; i; i=e[i].next) if(d[v=e[i].to]<d[u]+e[i].w) {
d[v]=d[u]+e[i].w;
if(++tm[v]>=n) return ; //环的点数>=n,每个点最多更新n-1次。
if(!vis[v]) {
vis[v]=; q[tail++]=v;
if(tail==N) tail=;
}
}
}
return ;
} int main() {
read(n); read(m);
int u, v, x;
for1(i, , m) {
read(x); read(u); read(v);
if(x==) add(u, v, ), add(v, u, );
else if(x==) {
if(u==v) { puts("-1"); return ; }
add(u, v, );
}
else if(x==) add(v, u, );
else if(x==) {
if(u==v) { puts("-1"); return ; }
add(v, u, );
}
else add(u, v, );
}
if(spfa()) {
long long ans=;
for1(i, , n) ans+=d[i];
printf("%lld", ans);
}
else puts("-1");
return ;
}
//自己写的
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int maxn = ;
struct edge{
int v;
int w;
int nxt;
}e[maxn*];
int n,k;
int cnt,head[maxn];
int rd[maxn];
bool vis[maxn];
ll dis[maxn];
int read(){
char ch=getchar();
int f=,x=;
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
int ins(int u,int v,int w){
cnt++;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].nxt = head[u];
head[u] = cnt;
}
bool spfa(){
int now,nt;
queue<int> q;
for(int i = ;i <= n;i++){
q.push(i);
dis[i] = rd[i]=;
}
while(!q.empty()){
now = q.front();
q.pop();
for(int i = head[now];i;i = e[i].nxt){
nt = e[i].v;
if(dis[nt]<dis[now]+e[i].w){
dis[nt] = dis[now]+e[i].w;
if(!vis[nt]){
vis[nt] = true;
q.push(nt);
rd[nt]++;
if(rd[nt]>n) return false;
}
}
}
vis[now] = false;
}
return true;
}
int main(){
n = read();
k = read();
int x,a,b;
for(int i = ;i <= k;i++){
x = read();
a = read();
b = read();
if(x == ){
ins(a,b,);
ins(b,a,);
}else if(x == ){
if(a==b){
cout<<-;
return ;
}
ins(a,b,);
}else if(x == ){
ins(b,a,);
}else if(x == ){
if(a==b){
cout<<-;
return ;
}
ins(b,a,);
}else{
ins(a,b,);
}
}
ll ans = ;
if(spfa()){
for(int i = ;i <= n;i++) ans += dis[i];
cout<<ans;
}else{
cout<<-;
}
return ;
}

bzoj2330 糖果的更多相关文章

  1. BZOJ2330 糖果题解 查分约束

    BZOJ 2330 糖果题解 差分约束系统 + SPFA 题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 Description ...

  2. bzoj2330糖果——差分约束

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束,再建立一个源点0,向所有点连边权为1的边,表示每个人都会分到糖果: 答案较大 ...

  3. bzoj2330糖果

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束裸题.练习用spfa判正环(一个点入队超过n次). 据说有1e5个点连成一条链 ...

  4. BZOJ2330 糖果[差分约束方案+spfa?/tarjan]

    以往对于差分约束理解不是太深,导致这题屡次被坑,在此记录一下细节的理解. 差分约束实际上就是利用了spfa的一个特性:只要有$dis_y>dis_x+w_{x,y}$就松弛,直到所有边关系都满足 ...

  5. BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]

    收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...

  6. 【BZOJ2330】【SDOI2012】糖果(差分约束,SPFA)

    [BZOJ2330][SDOI2012]糖果 题面 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要 ...

  7. BZOJ2330 SCOI2011 糖果 【差分约束】

    BZOJ2330 SCOI2011 糖果 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一 ...

  8. 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA

    [bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1)  [这个情况加个A==B无解的要特 ...

  9. 【BZOJ2330】糖果(差分约束系统,强连通分量,拓扑排序)

    题意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖 ...

随机推荐

  1. [WPF系列]Button 自定义

    A Simple Cross Button for WPF   CREATING MORE COMPLEX BUTTONS IN XAML   WPF Custom Controls - Withou ...

  2. MVC架构学习之EasyFirst——快点夸我爱学习~

    iMooc上的MVC教程练习. MVC是PHP基础和进阶的分界点吧应该说是 一.准备 工欲善其事~ 个人环境:windows10+wamp2.5+ZendStudio12: 项目名称:MVCEasyF ...

  3. es6学习笔记2-解构赋值

    解构赋值基本概论就按照一定的模式通过数组或者对象对一组变量进行赋值的过程. 1.通过数组对变量进行赋值: /*通过这种方式赋值要注意左右两边的结构模式要一样,在赋值的时候,根据位置进行赋值对应模式.* ...

  4. jquery工具方法access详解

    access : 多功能值操作(内部) access方法可以使set/get方法在一个函数中体现.比如我们常用的css,attr都是调用了access方法. css的使用方法: $(selector) ...

  5. mysql 有两种数据库引擎发音

    mysql 有两种数据库引擎 一种是 MyISAM,一种是 InnoDB MyISAM 发音为 "my-z[ei]m"; InnoDB 发音为 "in-no-db&quo ...

  6. js 字符串转换数字

    方法主要有三种转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对 ...

  7. 利用百度API Store接口进行火车票查询

    火车票查询 项目源码下载链接: Github:https://github.com/VincentWYJ/TrainTicketQuery 博客文件:http://files.cnblogs.com/ ...

  8. python基础-迭代器和生成器

    一.递归和迭代 1.递归:(问路示例) 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 2.迭代:简单理 ...

  9. ipad

    1. ipad pro 与 ipad air2 时间已经是2016.12.9, 苹果还没有推出新的ipad产品,有些纠结于哪款更适合自己,总结下产品不易获取的核心配置信息 ipad air2 ram ...

  10. bzoj2683

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1018  Solved: 413[Submit][Status][Discuss] ...