BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)
3436: 小K的农场
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2111 Solved: 986
[Submit][Status][Discuss]
Description
Input
Output
如果存在某种情况与小K的记忆吻合,输出”Yes”,否则输出”No”
Sample Input
3 1 2
1 1 3 1
2 2 3 2
Sample Output
样例解释
三个农场种植的数量可以为(2,2,1)
HINT
Source
(注意判定条件是>N,不是大于等于。
用dis表示不等式,然后跑最短路或者最长路即可。 9520ms
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn],To[maxn],Len[maxn];
int cnt,vis[maxn],num[maxn],dis[maxn],N;
void add(int u,int v,int w){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
bool SPFA()
{
queue<int>q;
memset(dis,-,sizeof(dis));
dis[]=; q.push(); vis[]=; num[]++;
while(!q.empty()){
int u=q.front(); q.pop(); vis[u]=;
for(int i=Laxt[u];i;i=Next[i]){ int v=To[i];
if(dis[v]<dis[u]+Len[i]){
dis[v]=dis[u]+Len[i];
if((++num[v])>N) return false;
if(!vis[v]) vis[v]=,q.push(v);
}
}
}
return true;
}
int main()
{
int M,opt,a,b,c;
scanf("%d%d",&N,&M);
rep(i,,N) add(,i,);
rep(i,,M){
scanf("%d",&opt);
if(opt==) {
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
}
else if(opt==) {
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
else {
scanf("%d%d",&a,&b);
add(a,b,); add(b,a,);
}
}
if(SPFA()) puts("Yes");
else puts("No");
return ;
}
然后优化了一下,把次数改为前者+1,而不是自加1。4452ms。 但是注意一下,CF1131D里这样是错的。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn<<],To[maxn<<],Len[maxn<<];
int cnt,vis[maxn],num[maxn],dis[maxn],N;
void add(int u,int v,int w){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
bool SPFA()
{
queue<int>q;
memset(dis,-,sizeof(dis));
dis[]=; q.push(); vis[]=; num[]++;
while(!q.empty()){
int u=q.front(); q.pop(); vis[u]=;
for(int i=Laxt[u];i;i=Next[i]){ int v=To[i];
if(dis[v]<dis[u]+Len[i]){
dis[v]=dis[u]+Len[i];
num[v]=num[u]+;
if(num[v]>N) return false;
if(!vis[v]) vis[v]=,q.push(v);
}
}
}
return true;
}
int main()
{
int M,opt,a,b,c;
scanf("%d%d",&N,&M);
rep(i,,N) add(,i,);
rep(i,,M){
scanf("%d",&opt);
if(opt==) {
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
}
else if(opt==) {
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
else {
scanf("%d%d",&a,&b);
add(a,b,); add(b,a,);
}
}
if(SPFA()) puts("Yes");
else puts("No");
return ;
}
把queue改为stack,然后就124ms了,估计不是因为queue比stack快,而是数据使然。
(据说是改为stck变为深搜DFS了!)
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn<<],To[maxn<<],Len[maxn<<];
int cnt,vis[maxn],num[maxn],dis[maxn],N;
void add(int u,int v,int w){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
bool SPFA()
{
stack<int>q;
memset(dis,-,sizeof(dis));
dis[]=; q.push(); vis[]=; num[]++;
while(!q.empty()){
int u=q.top(); q.pop(); vis[u]=;
for(int i=Laxt[u];i;i=Next[i]){ int v=To[i];
if(dis[v]<dis[u]+Len[i]){
dis[v]=dis[u]+Len[i];
num[v]=num[u]+;
if(num[v]>N) return false;
if(!vis[v]) vis[v]=,q.push(v);
}
}
}
return true;
}
int main()
{
int M,opt,a,b,c;
scanf("%d%d",&N,&M);
rep(i,,N) add(,i,);
rep(i,,M){
scanf("%d",&opt);
if(opt==) {
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
}
else if(opt==) {
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
else {
scanf("%d%d",&a,&b);
add(a,b,); add(b,a,);
}
}
if(SPFA()) puts("Yes");
else puts("No");
return ;
}
BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)的更多相关文章
- 【BZOJ3436】小K的农场 差分约束
[BZOJ3436]小K的农场 Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了, ...
- P1993 小K的农场 && 差分约束
首先第一篇讨论的是差分约束系统解的存在 差分约束系统是有 \(n\) 个变量及 \(m\) 个(如 \(x_{i} - x_{j} \leq a_{k}\) )关系组成的系统 差分约束解的求解可以转化 ...
- BZOJ 3436: 小K的农场 差分约束
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c -> b<=a-c ...
- 小K的农场 差分约束
题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...
- [bzoj3436]小K的农场_差分约束
小K的农场 bzoj-3436 题目大意:给定n个点,每个节点有一个未知权值.现在有m个限制条件,形如:点i比点j至少大c,点i比点j至多大c或点i和点j相等.问是否可以通过给所有点赋值满足所有限制条 ...
- bzoj3436小K的农场
bzoj3436小K的农场 题意: n个数,知道m条关系:a-b≥c.a-b≤c或a==b.问是否存在满足所有关系的情况.n≤10000,m≤10000. 题解: 差分约束.因为只要求是否满足,因此最 ...
- bzoj3436: 小K的农场(差分约束)
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1575 Solved: 690[Submit][Status][Discus ...
- bzoj3436: 小K的农场(差分约束)
3436: 小K的农场 题目:传送门 题解: 查分基础: t==1 a>=b+c t==2 b>=a-c t==3 a>=b+0 b>=a+0 跑最长路一A 代码: #i ...
- BZOJ3436 小K的农场
Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个 ...
随机推荐
- 3.1 Templates -- Handlerbars Basics(Handlerbars基础知识)
一.简介 Ember.js使用Handlerbars模板库来强化应用程序的用户界面.它就像普通的HTML,但也给你嵌入表达式去改变现实的内容. Ember使用Handlerbars并且用许多新特性去扩 ...
- ruby md5 sha1 base64加密
#md5加密 require 'md5' puts MD5.hexdigest('admin') #sha1加密 require 'digest/sha1' puts Digest::SHA1.hex ...
- 分页组件vue和jsp版本
vue版本 <template> <div class="com-vscroll"> <slot name="mcontent"& ...
- Educational Codeforces Round 54 (Rated for Div. 2) Solution
A - Minimizing the String solved 题意:给出一个字符串,可以移掉最多一个字符,在所有可能性中选取一个字典序最小的. 思路:显然,一定可以移掉一个字符,如果移掉的字符的后 ...
- redis入门学习记录(二)
继第一节 redis入门学习记录(一)之后,我们来学习redis的基本使用. 接下来我们看看/usr/local/redis/bin目录下的几个文件作用是什么? redis-benchmark:red ...
- C++多线程学习资料参考
新的C++11语法:<Professional C++>,或<C ++ Primer Plus>: C++11多线程:<C++ Concurrency in Actio ...
- Asynchronous Programming Model (APM)异步编程模型
https://msdn.microsoft.com/zh-cn/library/ms228963(v=vs.110).aspx 一.概念 An asynchronous operation that ...
- UVa 1658 海军上将(最小费用最大流)
https://vjudge.net/problem/UVA-1658 题意: 给出一个v个点e条边的有向加权图,求1~v的两条不相交(除了起点和终点外公共点)的路径,使得权和最小. 思路:把2到v- ...
- 深入Linux内核架构第一章笔记
1. Linux是多任务系统, 支持并发执行若干进程,系统同时真正运行的进程数目不超过CPU的数量,因此内核会按照时间间隔在不同进程之间切换. 2.确定那个进程运行多长时间的过程称为调度. 3.内核启 ...
- Codeforces Round #256 (Div. 2) D. Multiplication Table 很有想法的一个二分
D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes input stand ...