Luogu P3275

显然是一道经典的差分约束系统

相关知识可以查看:【Luogu 1993】差分约束系统问题——小K的农场

值得注意的是这题使用最长路更合适,因为每一个人都要取得至少一个糖果。在添加超级起点时,这本身就是一个使用大于等于号的关系,如果更换成小于等于号则会导致边的方向改变,这样又违背了超级起点的初衷。

#include<cstdio>
#include<algorithm>
using namespace std;
struct data
{
int to,next,val;
}e[500005];
int cost[500005],flag,head[500005],n,m,a,b,c,cnt,x,cnt1[500005],p=500005;
class queue
{
int x[5000005],head,tail;
public:
void push(int y)
{
x[tail]=y;
tail++;
tail%=p;
}
void pop()
{
head++;
head%=p;
}
bool empty()
{
return head==tail;
}
int back()
{
return x[tail-1];
}
int front()
{
return x[head];
}
}que;
bool vis[500005];
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].next=head[u];
e[cnt].val=w;
head[u]=cnt;
}
void First(int s)
{
for (int i=1;i<=n;i++) cost[i]=-0x3f3f3f3f;
cost[s]=0;
}
bool SPFA(int s)
{
que.push(s);
vis[s]=true;
while (!que.empty())
{
int now=que.front();
que.pop();
vis[now]=false;
for (int i=head[now];i;i=e[i].next)
{
if (cost[e[i].to]<cost[now]+e[i].val)
{
cost[e[i].to]=cost[now]+e[i].val;
if (!vis[e[i].to])
{
que.push(e[i].to);
vis[e[i].to]=true;
}
cnt1[e[i].to]=cnt1[now]+1;
if (cnt1[e[i].to]>n) return false;
}
}
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&a,&b);
if (x==1) add(a,b,0),add(b,a,0);
if (x==2)
{
if (a==b)
{
printf("-1");
return 0;
}
add(a,b,1);
}
if (x==3) add(b,a,0);
if (x==4)
{
add(b,a,1);
if (a==b)
{
printf("-1");
return 0;
}
}
if (x==5) add(a,b,0);
//特判可以防止TLE
}
for (int i=n;i>=1;i--)
add(n+1,i,1);//反向是为了防TLE,数据比较特别……
First(n+1);
if (!SPFA(n+1)) printf("-1");
else
{
long long ans=0;
for (int i=1;i<=n;i++)
ans+=cost[i];
printf("%lld",ans);
}
return 0;
}

【Luogu 3275】[SCOI2011]糖果的更多相关文章

  1. [Luogu 3275] SCOI2011 糖果

    [Luogu 3275] SCOI2011 糖果 第一道差分约束.感谢 AZe. 我的理解是根据一些不等关系建一个图,在图上边跑一个最长路(有时候是最短路). 因为可能存在负环,所以必须用 SPFA! ...

  2. [luogu P3275] [SCOI2011]糖果

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

  3. 【luogu P3275 [SCOI2011]糖果】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3275 把不等式 A > B 转化成 A - B >= 1或者 B - A <= -1再差分 ...

  4. 洛谷 3275 [SCOI2011]糖果

    题目戳这里 N句话题意 有N个人,k个限制,有五种限制 如果X=1, 表示第A个小朋友的糖果必须和第B个小朋友的糖果一样多: 如果X=2, 表示第A个小朋友的糖果必须少于第B个小朋友的糖果: 如果X= ...

  5. BZOJ2330或洛谷3275 [SCOI2011]糖果

    BZOJ原题链接 洛谷原题链接 很明显的差分约束,但数据范围较大,朴素\(SPFA\)判正环求解会\(T\)(理论上如此,但我看到有挺多人用朴素的还跑得挺快..),所以需要优化. 我们所建立的有向图中 ...

  6. bzoj2330: [SCOI2011]糖果

    2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...

  7. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  8. bzoj 2330 [SCOI2011]糖果(差分约束系统)

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3574  Solved: 1077[Submit][Status ...

  9. BZOJ 2330: [SCOI2011]糖果( 差分约束 )

    坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 ------------------------------------ ...

  10. P3275 [SCOI2011]糖果 && 差分约束(二)

    学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间 ...

随机推荐

  1. Javascript进阶必会

    概念: 局部块函数声明: ES5才承认有这个东西. function f(){return 'global';} function test(x){ var result = []; if(x) { ...

  2. 如何在Spring Boot中使用Cookies

    一. 导读 本文大纲 读取HTTP Cookie 设置HTTP Cookie 读取所有Cookie[] 为Cookie设置过期时间 Https与Cookie HttpOnly Cookie 删除Coo ...

  3. PHP限制上传文件大小

    在php.ini中修改如下变量,如要限制为100M upload_max_filesize = 100M post_max_size = 100M 重启Apache

  4. java中Arrays.sort()对二位数组进行排序

    int [][]a = new int [5][2]; //定义一个二维数组,其中所包含的一维数组具有两个元素 对于一个已定义的二位数组a经行如下规则排序,首先按照每一个对应的一维数组第一个元素进行升 ...

  5. 6、pytest -- 临时目录和文件

    目录 1. 相关的fixture 1.1. tmp_path 1.2. tmp_path_factory 1.3. tmpdir 1.4. tmpdir_factory 1.5. 区别 2. 默认的基 ...

  6. 转载:全面理解面向对象的 JavaScript

    来源:DeveloperWorks – 曾滢著 简介: JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向 ...

  7. Luogu P1098 字符串的展开

    这几天划了划水看了看初赛的试题,没写什么随笔. 今天刷刷洛谷试炼场.(不要问为什么我还在普及区) 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串 ...

  8. 【XSY2495】余数

    Input Output Input 3 4 Output 4 HINT 原式 =n*m-n除以i向下取整 用数论分块做就可以了 #include<bits/stdc++.h> #defi ...

  9. C/C++ return *this和return this的区别

    首先我们知道~ class Test { public: Test() { return this; //返回的当前对象的地址 } Test&() { return *this; //返回的是 ...

  10. Vue+element UI实现表格数据导出Excel组件

    介绍 这是一个可以将页面中的表格数据导出为Excel文件的功能组件,该组件一般与表格一起使用,将表格数据传给组件,然后通过点击组件按钮可将表格中的数据导出成Excel文件. 使用方法 由于封装该组件内 ...