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.4 Templates -- Displaying A List of Items(展示一个集合)
一. 概述 1. example 如果你需要遍历一个对象集合,使用Handlebars的{{#each}}. <ul> {{#each people key="id" ...
- devise 自定义手机号登录
user model中配置 validates_uniqueness_of :phone def email_required? false end 修改user migration文件,给phone ...
- 23TCP通信
.pro 文件中加入:QT+=network 在Qt中实现TCP/IP服务器端通信的流程: 1.创建监听套接字,QTcpServer 2.将监听套接字设置为监听模式, listen 3.等待并接受客户 ...
- Python 读取写入配置文件 ConfigParser
https://blog.csdn.net/piaodexin/article/details/77371343 https://www.cnblogs.com/feeland/p/4502931.h ...
- FFmpeg 入门(7):Seeking
本文转自:FFmpeg 入门(7):Seeking | www.samirchen.com 处理 seek 命令 我们将为播放器添加 seek 的能力.这个过程中,我们会看到 av_seek_fram ...
- 20145312 《网络对抗》PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验
20145312 <网络对抗>PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验 注入shellcode 实验步骤 1. 准备一段Shellcode 2. ...
- 20145311 《Java程序设计》第十周学习总结
20145311 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 ·网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据·程序员所作的事情就是把数据发送到指定的位置 ...
- Windows10下用Anaconda3安装TensorFlow教程【转】
本文转载自:https://www.cnblogs.com/HongjianChen/p/8385547.html 1. 安装好Anaconda3版本 (1) 注:可以发现最新版本是Anaconda5 ...
- CentOS7.2 安装nginx-1.10.3
nginx-1.10.3 下载nginx 检查是否安装了依赖库: [root@localhost ~]# rpm -q gcc gcc-4.8.5-11.el7.x86_64 [root@localh ...
- 根据Bootstrap的Modal开发的提示框
代码: (function ($) { $(function () { var Modal = function () { var htmlContent = "<div id=\&q ...