2330: [SCOI2011]糖果

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 6355  Solved: 2096
[Submit][Status][Discuss]

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

题目中要求糖果总和最少,所以要每个人的糖果数都尽可能少

那么如果A要求糖果比B多,那么就让A的糖果比B多一颗就好了

如果A要求糖果数不能少于B,那么就让A的糖果和B尽量一样

这样的话就可以建图:

将每个小朋友当做一个点,点的权值为糖果数,初始化val[]全为1

①如果A和B糖果一样多,则A和B连接一条长度为0的双向边

②如果A糖果比B少,则A和B连接一条长度为1的单向边

③如果A糖果不能比B多,则A和B连接一条长度为0的单向边

②如果B糖果比A少,则B和A连接一条长度为1的单向边

③如果B糖果不能比A多,则B和A连接一条长度为0的单向边

这样如果存在正权环,那么肯定就无解(包括自环),否则有解

SPFA求一遍最长路就好了,一开始要让所有的点都进队列

然后让整个图满足val[u]+e(u, v)=val[v] (u, v∈G)

#include<stdio.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct
{int v;int val;
}Road;
Road temp;
vector<Road> G[100005];
queue<int> q;
int now, val[100005], vis[100005], sum[100005];
int main(void)
{int n, m, i, x, a, b, ok, v;long long ans;while(scanf("%d%d", &n, &m)!=EOF){ok = 1;for(i=1;i<=n;i++)G[i].clear();for(i=1;i<=m;i++){scanf("%d%d%d", &x, &a, &b);if(a==b){if(x%2==0)ok = 0;continue;}switch(x){case 1:  temp.val = 0, temp.v = b;  G[a].push_back(temp);temp.v = a;  G[b].push_back(temp);  break;case 2:  temp.val = 1, temp.v = b;  G[a].push_back(temp);  break;case 3:  temp.val = 0, temp.v = a;  G[b].push_back(temp);  break;case 4:  temp.val = 1, temp.v = a;  G[b].push_back(temp);  break;case 5:  temp.val = 0, temp.v = b;  G[a].push_back(temp);}}if(ok==0){printf("-1\n");            //  如果图中有自环且权值为正,无解continue;}while(q.empty()==0)q.pop();for(i=1;i<=n;i++){sum[i] = 0;val[i] = vis[i] = 1;q.push(i);}while(q.empty()==0){now = q.front();q.pop();vis[now] = 0;for(i=0;i<G[now].size();i++){temp = G[now][i];if(val[now]+temp.val>val[temp.v]){val[temp.v] = val[now]+temp.val;if(sum[temp.v]++>=n)ok = 0;if(vis[temp.v]==0){vis[temp.v] = 1;q.push(temp.v);}if(ok==0)break;}}if(ok==0)break;}if(ok==0)printf("-1\n");else{ans = 0;for(i=1;i<=n;i++)ans += val[i];printf("%lld\n", ans);}}return 0;
}

SPFA差分约束(bzoj 2330: [SCOI2011]糖果)相关推荐

  1. bzoj 2330: [SCOI2011]糖果

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

  2. Schedule Problem spfa 差分约束

    题意:有n个任务,给出完成n个任务所需时间,以及一些任务安排.任务安排有四种: FAS a b:任务a需在任务b开始后完成. FAF a b:任务a需在任务b完成后完成. SAF a b:任务a需在任 ...

  3. [spfa][差分约束] 洛谷 P3084 照片Photo

    题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...

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

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

  5. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详(并不)解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多 ...

  6. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

  7. 【差分约束】SCOI2011糖果

    P3275 [SCOI2011]糖果 快noip了我还在干什么啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 来我们看这道题 根据条件建图, 因为求得是最小值, 所以要跑最长路qwq(这是我记住的QAQ ...

  8. 【POJ - 3159】Candies (差分约束,卡SPFA)

    题干: 在幼儿园的时候,Flymouse是班上的班长.有时班主任会给班上的孩子们带来一大袋糖果,让他们分发.所有的孩子都非常喜欢糖果,经常比较他们和别人买的糖果的数量.一个孩子A可以有这样的想法,尽管 ...

  9. poj3159差分约束+栈实现的spfa+邻接链表

    题意:班长派糖果,一共有n个人,有m个关系,每个关系输入如 a b v,代表a希望自己的糖果不会比b少v个,又由于班长很痛恨编号为1的同学,希望尽量比他多尽量多得糖果,求最多可以多多少(班长的编号是n ...

最新文章

  1. 在Eclipse新建菜单中添加JSP
  2. leetcode 113. 路径总和 II
  3. 【HDU 1276】士兵队列训练问题(两个队列模拟)
  4. 常用 API 函数(3): 文件处理函数
  5. 华为怎么删除自带的音乐_华为手机独有的这个模式,让睡觉更舒畅
  6. Consul添加配置详解
  7. 2021SC@SDUSC 量子加密库libqs
  8. varchar和varchar2的联系与区别
  9. ue4 和 c4d 区别 以及日常理解
  10. Linux课程之linux的发展
  11. 托米的咒语 牛客练习赛23 D
  12. uva 563 Crimewave
  13. linux 的源码怎么查看,查看linux源代码
  14. 用C语言写藏头诗或藏尾诗
  15. QT 5.15 最新安装指南(针对不同系统)
  16. linux修改系统时区为上海
  17. CTFshow-命令执行(4)
  18. 长沙小学计算机老师,2019下半年湖南长沙小学信息技术教师资格证面试试题考什么内容...
  19. 将多个txt文件批量导入到同个excel的不同sheet中
  20. KEIL4/5的背景色修改

热门文章

  1. python程序员工资-Python工资高还是Java?
  2. python入门指南-Python完全小白入门指南
  3. python安装教程-Python安装包+安装教程
  4. win10语音识别的设置和开启
  5. LD3320的嵌入式语音识别系统的应用
  6. JS的一些时间获取和计算公用方法封装
  7. 搭建 Harbor 1.10.6 高可用集群
  8. app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
  9. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4
  10. vue-element日期框点击不显示,不刷新