差分约束,主要用来解决数学中的线性规划问题,通过差值与两个未知数可以转化为单源最长路问题(或负值最短路)。

  当有一个式子为x1-x2>=a时,我们可以建边,这条边设定为x1比x2大等a(或x2比x1小等a),并且全图统一为大等或统一为小等,因为条件相同可以进行条件传递,可以考虑用单源最短解决,然后可以直接用spfa解决就好辣。(事实上这就是一种思想,甚至可以用向量来考虑,重点是条件的传递性)。

  下面给一道裸题

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

裸题没什么好讲的

然后愉快的给出代码

 #include<stdio.h>
struct shit{
long long aim;
long long next;
long long val;
}e[];
long long point,head[],quq[],d[],x,a,b,n,m,ass,star,ans,vis[];
bool f[];
void fuck(long long x,long long y,long long num)
{
e[++point].aim=y;
e[point].val=num;
e[point].next=head[x];
head[x]=point;
}
bool spfa(int x)
{
quq[++star]=x;
ass=;
f[quq[star]]=true;
++vis[quq[star]];
while(star<=ass)
{
for(int i=head[quq[star]];i!=;i=e[i].next)
{
int v=e[i].aim;
if(d[quq[star]]+e[i].val>d[v])
{
if(++vis[v]>=n)return true;
d[v]=d[quq[star]]+e[i].val;
if(f[v])continue;
quq[++ass]=v;
f[v]=true;
}
}
f[quq[star++]]=false;
}
return false;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&a,&b);
if(x==){fuck(a,b,);fuck(b,a,);}
else if(x==)fuck(b,a,);
else if(x==){
if(a==b){printf("-1");return ;}
fuck(a,b,);
}
else if(x==)fuck(a,b,);
else if(x==){
if(a==b){printf("-1");return ;}
fuck(b,a,);
}
}
for(int i=n;i>=;i--)fuck(,i,);
if(spfa()){printf("-1");return ;}
for(int i=;i<=n;i++)ans+=d[i];
printf("%lld",ans);
return ;
}

数据结构》关于差分约束的两三事(BZOJ2330)的更多相关文章

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

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

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

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

  3. 差分约束 【bzoj2330】[SCOI2011]糖果

    /*[bzoj2330][SCOI2011]糖果 2014年3月5日1,2761 Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖 ...

  4. bzoj2330(差分约束)

    题解:这道题是练差分约束的一道好题目吧,我具体在代码中注释,这样更加好理解, 为什么求最长路呢?因为这样保证了满足条件,如果存在正权环,就表示无解,就是 正权环之间不断要更多的糖果才行. #inclu ...

  5. BZOJ2330:[SCOI2011]糖果(差分约束)

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

  6. bzoj2330: [SCOI2011]糖果(差分约束)

    差分约束裸题,a==b的话分别建a>=b a<=b的边就行.倒序加边不然会TLE是什么鬼 #include<iostream> #include<cstring> ...

  7. bzoj2330糖果——差分约束

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

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

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

  9. POJ——3159Candies(差分约束SPFA+前向星+各种优化)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 28071   Accepted: 7751 Descrip ...

随机推荐

  1. 基于Photon 的 PUN+ 如何自动实现RPC呼叫的.

    基于Photon 的 PUN+ 如何自动实现RPC呼叫的. 简单说函数标记成 RPC 类型的. void Hello() { Debug.Log("Hello"); PhotonV ...

  2. vim 插件使用

    a.vim的安装相当简单,下载a.vim后丢进Vim插件目录(一般为~/.vim/plugin),必要时再重启一下Vim就可以使用了. 头/源文件切换命令 :A 头文件/源文件切换 :AS 分割窗后并 ...

  3. 机器学习(九)—FP-growth算法

    本来老师是想让我学Hadoop的,也装了Ubuntu,配置了Hadoop,一时间却不知从何学起,加之自己还是想先看点自己喜欢的算法,学习Hadoop也就暂且搁置了,不过还是想问一下园子里的朋友有什么学 ...

  4. linux之管道

    1. 进程间通信概述 进程是一个独立的资源分配单元,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源.进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要 ...

  5. SCARA——OpenGL入门学习一、二

    参考博客:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 简介 最近开始一个机械手臂的安装调试,平面关节型机器人又称SCA ...

  6. uoj #190. 【集训队互测2016】消失的源代码 提交答案题

    Test 1: 发现是一个字母表的映射 把 \('a' \to 'z'\) 打进去找出映射就好了QAQ . Test 2: 求助 \(dalao\) 得知的点.. 答案是 : \(2016x^2 + ...

  7. Python reload() 函数

    reload(module) 作用: 用于重新载入之前载入的模块. module -- 模块对象.返回模块对象. 实例:  重新载入 sys 模块,并设置默认编码为 utf8 >>> ...

  8. 客户端如何调用WebService并且POST数据

    直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text;using Sys ...

  9. javabrideg的使用实践

    (1)进入这个网站http://sourceforge.net/projects/php-java-bridge/files,选择Binary package,然后选择最新的版本Php-java-br ...

  10. php通过时间戳处理时间!

    1.获取当前时间方法date() 很简单,这就是获取时间的方法,格式为:date(format,format,timestamp),format为格式.timestamp为时间戳–可填参数. 2.获取 ...