[Luogu 3275] SCOI2011 糖果
[Luogu 3275] SCOI2011 糖果
第一道差分约束。感谢 AZe。
我的理解是根据一些不等关系建一个图,在图上边跑一个最长路(有时候是最短路)。
因为可能存在负环,所以必须用 SPFA!
好神奇啊,图论好强强啊。
然而 Capella 惨惨,用上了 0 号节点却从 1 开始初始化邻接表,导致 for 出不去了,就因为这个调了一个晚上。
指针选手初始化很重要啊。
加油qwq
#include <algorithm>
#include <cstdio>
#include <queue>
#define nullptr NULL
const int MAXN = 100010;
int n, k;
long long ans;
struct Graph
{
struct Edge
{
int to;
long long w;
Edge *next;
Edge(int to, long long w, Edge* next): to(to), w(w), next(next) {}
~Edge(void)
{
if(next != nullptr)
delete next;
}
}*head[MAXN];
Graph(int n)
{
std :: fill(head, head + n + 1, (Edge*)nullptr);
}
~Graph(void)
{
for(int i = 1; i <= n; ++i)
delete head[i];
}
void AddEdge(int u, int v, long long w)
{
head[u] = new Edge(v, w, head[u]);
}
void Build(int x, int a, int b)
{
if(x % 2 == 0 && a == b)
{
puts("-1");
exit(0);
}
switch(x)
{
case 1:
AddEdge(a, b, 0LL);
AddEdge(b, a, 0LL);
break;
case 2:
AddEdge(a, b, 1LL);
break;
case 3:
AddEdge(b, a, 0LL);
break;
case 4:
AddEdge(b, a, 1LL);
break;
case 5:
AddEdge(a, b, 0LL);
break;
}
}
}*G;
namespace DiffConst
{
bool exist[MAXN];
int cnt[MAXN];
long long dist[MAXN];
bool SPFA(int S)
{
std :: queue<int> Q;
Q.push(S);
exist[S] = true;
while(!Q.empty())
{
int u = Q.front(), v;
Q.pop();
exist[u] = false;
for(Graph :: Edge *i = G -> head[u]; i != nullptr; i = i -> next)
if(dist[v = i -> to] < dist[u] + i -> w)
{
if(!exist[v])
{
if(++cnt[v] == n)
return false;
Q.push(v);
exist[v] = 1;
}
dist[v] = dist[u] + i -> w;
}
}
return true;
}
}
int main(void)
{
scanf("%d %d", &n, &k);
G = new Graph(n);
for(int i = 1, x, a, b; i <= k; ++i)
{
scanf("%d %d %d", &x, &a, &b);
G -> Build(x, a, b);
}
for(int i = n; i >= 1; --i)
G -> AddEdge(0, i, 1LL);
if(DiffConst :: SPFA(0))
{
for(int i = 1; i <= n; ++i)
ans += DiffConst :: dist[i];
printf("%lld\n", ans);
}
else
puts("-1");
return 0;
}
谢谢阅读。
[Luogu 3275] SCOI2011 糖果的更多相关文章
- [luogu P3275] [SCOI2011]糖果
[luogu P3275] [SCOI2011]糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些 ...
- 【luogu P3275 [SCOI2011]糖果】 题解
题目链接:https://www.luogu.org/problemnew/show/P3275 把不等式 A > B 转化成 A - B >= 1或者 B - A <= -1再差分 ...
- 洛谷 3275 [SCOI2011]糖果
题目戳这里 N句话题意 有N个人,k个限制,有五种限制 如果X=1, 表示第A个小朋友的糖果必须和第B个小朋友的糖果一样多: 如果X=2, 表示第A个小朋友的糖果必须少于第B个小朋友的糖果: 如果X= ...
- BZOJ2330或洛谷3275 [SCOI2011]糖果
BZOJ原题链接 洛谷原题链接 很明显的差分约束,但数据范围较大,朴素\(SPFA\)判正环求解会\(T\)(理论上如此,但我看到有挺多人用朴素的还跑得挺快..),所以需要优化. 我们所建立的有向图中 ...
- bzoj2330: [SCOI2011]糖果
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友 ...
- BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5395 Solved: 1750[Submit][Status ...
- bzoj 2330 [SCOI2011]糖果(差分约束系统)
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3574 Solved: 1077[Submit][Status ...
- BZOJ 2330: [SCOI2011]糖果( 差分约束 )
坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 ------------------------------------ ...
- P3275 [SCOI2011]糖果 && 差分约束(二)
学习完了差分约束是否有解, 现在我们学习求解最大解和最小解 首先我们回想一下是否有解的求解过程, 不难发现最后跑出来任意两点的最短路关系即为这两元素的最短路关系. 即: 最后的最短路蕴含了所有元素之间 ...
随机推荐
- 【CSAPP笔记】10. 代码优化
写程序的主要目标是使它在所有可能的情况下都能正确运行(bug free),一个运行得很快但有 bug 的程序是毫无用处的.在 bug free 的基础上,程序员必须写出清晰简洁的代码,这样做是为了今后 ...
- 转载---Atom编辑器常用快捷键
常用快捷键–亲测及翻译 英文 中文 快捷键 功能 New Window 新建界面窗口 Ctrl + Shift + N 如中文意思 New File 新建文件 Ctrl + N 如中文意思 Open ...
- js+Canvas 利用js 实现浏览器保存图片到本地
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Excel作为数据源TesTNG做数据驱动完整代码
说明:EXCEL 支持xls 和xlsx 俩种格式 : 已经过测试 ! package main.java; import org.apache.poi.ss.usermodel.*; import ...
- [转帖]DAS、SAN、NAS
http://blog.itpub.net/26736162/viewspace-2214368/ DAS(Direct-attached Storage) 直连存储 直连式存储与服务器主机之间的连接 ...
- 深入探索.NET内部了解CLR如何创建运行时对象
前言 SystemDomain, SharedDomain, and DefaultDomain. 对象布局和内存细节. 方法表布局. 方法分派(Method dispatching). 因为公共语言 ...
- ACM数论之旅11---浅谈指数与对数(长篇)(今天休息,不学太难的数论> 3<)
c/c++语言中,关于指数,对数的函数我也就知道那么多 exp(),pow(),sqrt(),log(),log10(), exp(x)就是计算e的x次方,sqrt(x)就是对x开根号 pow()函数 ...
- VLD 无法打印堆栈调用情况
调试时遇到了一个比较郁闷的问题:同样一个MFC工程,复制之后无任何附加操作,VLD便无法正常打印内存泄漏处的堆栈调用了 百度了一下,重要找到了答案:“VLD不支持中文” 复制工程时windows自动在 ...
- POJ3281_Dining
有一些饮料和食物,每种一个,每个客人喜欢一些饮料和一些食物,每个客人可以选择一种饮料和一种食物,问最多能够同时满足多少个客人同时拥有饮料和食物. 这样的,源点连接饮料,汇点连接食物,中间人分别连接饮料 ...
- C++模式学习------模板模式
模板模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模板模式是一种很常用的模式,在很多的框架或者基类重载的时候都 ...