【洛谷P4878】布局
题目大意:给定一个长度为 N 的递增序列,有 M 组差分约束关系,求满足这些约束关系时,第一个数和第 N 个数的差是多少。
题解:首先,能否满足约束关系需要判断一下负环,若满足约束关系,再从第一个点 spfa 即可求出答案。大于小于号打反检查一个小时,好久没遇到这种错误了。。我枯了QAQ。。。。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxv=1010;
const int maxe=1e5+10;
const int inf=0x7fffffff;
struct node{
int nxt,to,w;
}e[maxe];
int tot=1,head[maxv];
inline void add_edge(int from,int to,int w){
e[++tot]=node{head[from],to,w},head[from]=tot;
}
int n,ml,md,d[maxv],cnt[maxv];
bool in[maxv];
void read_and_parse(){
scanf("%d%d%d",&n,&ml,&md);
for(int i=1,a,b,c;i<=ml;i++){
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
for(int i=1,a,b,c;i<=md;i++){
scanf("%d%d%d",&a,&b,&c);
add_edge(b,a,-c);
}
for(int i=1;i<=n;i++)add_edge(0,i,0);
for(int i=2;i<=n;i++)add_edge(i,i-1,0);
}
bool check(){
queue<int> q;
memset(d,0x3f,sizeof(d));
d[0]=0,in[0]=1,q.push(0);
while(q.size()){
int u=q.front();q.pop(),in[u]=0;
if(cnt[u]>n)return 1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w,cnt[v]=cnt[u]+1;
if(!in[v])in[v]=1,q.push(v);
}
}
}
return 0;
}
void spfa(){
queue<int> q;
fill(d+1,d+n+1,inf);
memset(in,0,sizeof(in));
d[1]=0,in[1]=1,q.push(1);
while(q.size()){
int u=q.front();q.pop(),in[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(!in[v])in[v]=1,q.push(v);
}
}
}
}
void solve(){
if(check())return (void)puts("-1");
spfa();
if(d[n]==inf)puts("-2");
else printf("%d\n",d[n]);
}
int main(){
read_and_parse();
solve();
return 0;
}
【洛谷P4878】布局的更多相关文章
- 差分约束算法————洛谷P4878 [USACO05DEC] 布局
题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn< ...
- 洛谷 P4878 [USACO05DEC]layout布局
题面链接 sol:差分约束系统裸题,根据a+b<=c建个图跑个最短路就没了... #include <queue> #include <cstdio> #include ...
- 洛谷P4878 [USACO05DEC]layout布局
题目描述 正如其他物种一样,奶牛们也喜欢在排队打饭时与它们的朋友挨在一起.\(FJ\) 有编号为 \(1\dots N\) 的 \(N\) 头奶牛 \((2\le N\le 1000)\).开始时,奶 ...
- 洛谷 [USACO05DEC] 布局 题解
今天学了差分约束系统, 这是一道板子题. 核心:a[v]>a[u]+d 相当于从u到v连一条长度为d的有向边.由于要判断有环,所以要从0点先跑一遍spfa因为1点不一定能到所有的点. #incl ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- 洛谷 p1219 八皇后
刚参加完蓝桥杯 弱鸡错了好几道..回头一看确实不难 写起来还是挺慢的 于是开始了刷题的道路 蓝桥杯又名搜索杯 暴力杯...于是先从dfs刷起 八皇后是很经典的dfs问题 洛谷的这道题是这样的 上面的布 ...
- 洛谷P1219 :八皇后(DFS+回溯)
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷P1219 八皇后【dfs】
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
随机推荐
- Object.prototype.toString.call()
源码中有这样一段: class2type = {}, toString = class2type.toString, function type(obj) { //obj为null或者undefi ...
- keras中TimeDistributed的用法
TimeDistributed这个层还是比较难理解的.事实上通过这个层我们可以实现从二维像三维的过渡,甚至通过这个层的包装,我们可以实现图像分类视频分类的转化. 考虑一批32个样本,其中每个样本是一个 ...
- ansible的playbook简单使用
一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...
- RN 实战 & React Native 实战
RN 实战 & React Native 实战 https://abc.xgqfrms.xyz/react-native-docs/ 0.59 https://github.com/xgqfr ...
- Fetch API & Delete & HTTP Methods
Fetch API & Delete & HTTP Methods vue https://developer.mozilla.org/en-US/docs/Web/API/Fetch ...
- loadrunner -vuser
在每个负载生成器上,安装 remote agent dispatcher(process) 和 loadrunner agent 控制器指示remote agent dispatcher 在load ...
- Ubuntu16.04 启动纯文本界面方法
问题: Ubuntu16.04 如何启动纯文本界面. 解决方法: 1.系统启动后,在登陆界面点击Ctrl+Shift+F1切换到文本登陆界面: 2.修改为默认从文本界面登陆: sudo vi /etc ...
- C#/.Net判断是否为周末/节假日
判断节假日请求的Api:http://tool.bitefu.net/jiari/ /// <summary> /// 判断是不是周末/节假日 /// </summary> / ...
- nargin
nargin 编辑 nargin为“number of input arguments”的缩写. 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数.在matl ...
- 【C/C++】C/C++中的数组是怎么实现的?
几乎所有的语言都把数组作为一种固有的数据类型,数组也是我们最常用的数据结构之一.在语言底层,数组是如何实现的呢?本文以抽象数据类型的形式,定义.实现数组. 创建数组,理论上,我们可以使用创建任意维度的 ...