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个 ...
随机推荐
- eclipse导入Java源码
eclipse导入Java源码 下载源码包(一般jdk都自带了, 我的没有) src.zip eclipse -> window -> preferences -> JAVA -&g ...
- py文件生成pyc
鼠标右键 在此处打开命令行 python -m compileall xxx.py可以对当前目录下的xxx.py文件生成pyc
- IP地址与MAC地址
作者:知乎用户链接:https://www.zhihu.com/question/21546408/answer/28155896来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- [置顶] SNMP协议详解<三>
在上篇文章中,说到了SNMPv3主要在安全性方面进行了增强,采用USM(基于用户的安全模型)和VACM(基于视图的访问控制模型)技术.下面我们就主要讲解SNMPv3的报文格式以及基于USM的认证和加密 ...
- SwitchyOmega 设置修改代理
在开发过程中,web.config中很多配置都是生产的域名,但是在本地开发时并不能用这些生产的地址,就想在打开该域名时跳转到本地ip地址. 修改方式: 1.hosts文件修改 这种方式是在整个电脑上面 ...
- CF_863_F(Netflow)
codeforces_863_F 题目大意:给出一个数组的大小(n<=50),以及每个位置填数的范围限制(若无限制,即为1-n),最后求填出数组的最小花费,定义总花费为数组中每个数出现次数的平方 ...
- 分布式缓存--系列1 -- Hash环/一致性Hash原理
当前,Memcached.Redis这类分布式kv缓存已经非常普遍.从本篇开始,本系列将分析分布式缓存相关的原理.使用策略和最佳实践. 我们知道Memcached的分布式其实是一种“伪分布式”,也就是 ...
- Same Tree,判断两个二叉树是不是相同的树,结构相同,每个节点的值相同
算法分析:这道题很简单,利用递归即可. public class SameTree { public boolean isSameTree(TreeNode p, TreeNode q) { if(p ...
- haskell简明入门(一)
本文的主要内容参考自<Haskell趣学指南> 1. What is Haskell? 以下内容引用自Haskell官网: Haskell是一个先进的,纯粹的函数式编程语言.一个典 ...
- Android之获取输入用户名与密码发送短信
打算在过两三天的时间我就要准备出发去浙江了,所以把之前的资料来个总结. 这都是在课堂上做过的作业. 好了,废话少说,直接上代码. 步骤: 1.设置单击事件2.获取输入的QQ号码与密码3.判断输入获取的 ...