题目描述

幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。
但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, lxhgww 需要满足小朋友们的 K 个要求。
幼儿园的糖果总是有限的, lxhgww 想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

输入格式

输入的第一行是两个整数 N ,K  。
接下来  行,表示这些点需要满足的关系,每行  个数字,X  ,A  ,B  。
如果 X=1 .表示第 A 个小朋友分到的糖果必须和第 B 个小朋友分到的糖果一样多。
如果 X=2 ,表示第  A个小朋友分到的糖果必须少于第 B 个小朋友分到的糖果。
如果 X=3,表示第  A个小朋友分到的糖果必须不少于第 B 个小朋友分到的糖果。
如果 X=4 ,表示第  A个小朋友分到的糖果必须多于第 B 个小朋友分到的糖果。
如果 X=5 ,表示第  A个小朋友分到的糖果必须不多于第 B 个小朋友分到的糖果。

输出格式

输出一行,表示 lxhgww 老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出 -1  。

样例
输入复制
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
输出复制
11
 
数据范围与提示

对于 100% 的数据,保证 N,K<1E5  。

_____________________________________________

差分约束

a==b 等价于 a>=b&&b>=a

a<b   等价于 b-a>=1

注意开LONG LONG

_____________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 int n,m;
5 struct edge
6 {
7 int u,v,w,nxt;
8 }e[maxn*5];
9 int head[maxn],js;
10 void addage(int u,int v,int w)
11 {
12 e[++js].u=u;e[js].v=v;e[js].w=w;
13 e[js].nxt=head[u];head[u]=js;
14 }
15 int dis[maxn],cs[maxn];
16 bool inq[maxn];
17 deque<int>q;
18
19 bool spfa(int u)
20 {
21 memset(dis,0xff,sizeof dis);
22 dis[u]=0;cs[u]++;
23 inq[u]=1;q.push_back(u);
24 while(!q.empty())
25 {
26 int u=q.front();q.pop_front();inq[u]=0;
27 for(int i=head[u];i;i=e[i].nxt)
28 {
29 int v=e[i].v,w=e[i].w;
30 if(dis[v]<dis[u]+w)
31 {
32 dis[v]=dis[u]+w;
33 if(!inq[v])
34 {
35 if(!q.empty() && dis[q.front()]<=dis[v])q.push_front(v);
36 else q.push_back(v);
37 ++cs[v];
38 if(cs[v]>n)return 0;
39 inq[v]=1;
40 }
41 }
42 }
43 }
44 return 1;
45 }
46 int main()
47 {
48 scanf("%d%d",&n,&m);
49 for(int op,a,b,i=1;i<=m;++i)
50 {
51 scanf("%d%d%d",&op,&a,&b);
52 if(op==1){addage(a,b,0);addage(b,a,0);}
53 else if(op==2)addage(a,b,1);
54 else if(op==3)addage(b,a,0);
55 else if(op==4)addage(b,a,1);
56 else addage(a,b,0);
57 }
58 for(int i=1;i<=n;++i)addage(0,i,1);
59 bool bz=spfa(0);
60 if(bz==0)
61 {
62 puts("-1");
63 return 0;
64 }
65 long long ans=0;
66 for(int i=1;i<=n;++i)ans+=dis[i];
67 cout<<ans;
68 return 0;
69 }

LOJ2436的更多相关文章

  1. loj2436 糖果

    传送门 分析 我们知道对于一个不等式a<b可以将其转化为a+1<=b的形式,在知道这个之后我们便可以将5个关系进行差分约束了,具体的建边方式见代码.注意由于每个人都必须有糖,我们把每个人的 ...

随机推荐

  1. hibernate连接数据库中文乱码

    4.做完这两步还是不行,需要修改hibernate的配置文件hibernate.cfg.xml,在配置文件配置hibernate.connection.url属性.示例: <property n ...

  2. Java学习日报7.10

    package Address;import java.util.Scanner; public class Address{ Scanner sc=new Scanner(System.in); p ...

  3. ElasticSearch教程——filter与query对比(转学习使用)

    一.数据准备 PUT /company/employee/2 { "address": { "country": "china", &quo ...

  4. java:并发编程-Callable与Future模式

    自己对线程池的理解: coresize 3 maxsize 5 blockLinkedQuenue 3 当提交的任务在<=3时,创建三个线程干活 大于3时,把任务先加入阻塞式队列,当有空闲的核心 ...

  5. idea破解方式:永久激活

    相信很多小伙伴都发现了,每年到年底的时候,idea注册码都大面积的失效,早上到办公室打开电脑发现注册码过期,还要花很长时间找新的: 这里介绍两种破解方式,都是有生之年不到期:与网上现有的方式基本一致. ...

  6. netty核心组件之EventLoopGroup和EventLoop

    这节我们着重介绍netty最为核心的组件EventLoopGroup和EventLoop EventLoopGroup:顾名思义就是EventLoop的组,下面来看它们的继承结构 在netty中我们可 ...

  7. 任意文件下载漏洞的接口URL构造分析与讨论

    文件下载接口的URL构造分析与讨论 某学院的文件下载接口 http://www.****.edu.cn/item/filedown.asp?id=76749&Ext=rar&fname ...

  8. Kali Debian 修改时区

    1.KaliDebian默认读取时区文件是/etc/localtime(重建软连接,达到修改时区目的) 2./etc/localtime是个软连接,连接到时区文件/usr/share/zoneinfo ...

  9. SQL注入之堆叠注入(堆查询注入)

    Stached injection -- 堆叠注入 0x00 堆叠注入的定义 ​ Stacked injection 汉语翻译过来后,称 为堆查询注入,也有称之为堆叠注入.堆叠注入为攻击者提供了很多的 ...

  10. 手把手教你搭建一个跟vue官方同款文档(vuepress)

    前言 VuePress 由两部分组成:第一部分是一个极简静态网站生成器 (opens new window),它包含由 Vue 驱动的主题系统和插件 API,另一个部分是为书写技术文档而优化的默认主题 ...