POJ 3169 Layout 【差分约束】+【spfa】
<题目链接>
题目大意:
一些母牛按序号排成一条直线。有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离。如果没有最大距离输出-1,如果1、n之间距离任意就输出-2,否则输出最大的距离。
解题分析:
典型的差分约束,第一种约束,v-u<=c;第二种约束:v-u>=c 可以转化为 u-v<=c ,还有一种约束,因为题目要求按序号排序,所以 loc[i] - loc[i-1]>=0 ,即 loc[i-1]-loc[i]<=0 。以上就是本题的三种约束,利用上述三种约束建图,然后跑一遍最短路即可,因为可能存在负权边,所以用spfa求解。当该图存在负环的时候输出-1,当1~n不连通的时候输出-2,否则输出1---->n的最短边权约束和。即所求的最大距离。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; const int N =1e3+;
const int M =2e5+;
#define INF 0x3f3f3f3f
struct EDGE{
int to,val,next;
}edge[M];
int head[N],dis[N],cnt[N],tot,n,ml,md;
bool vis[N]; void init(){
memset(head,-,sizeof(head));
tot=;
}
void add(int u,int v,int w){
edge[++tot].to=v,edge[tot].val=w;
edge[tot].next=head[u],head[u]=tot;
}
int spfa(int s){ //因为存在负权边,所以用spfa求最短路
memset(dis,INF,sizeof(dis));
memset(vis,false,sizeof(vis));
memset(cnt,,sizeof(cnt));
queue<int>q;
q.push(s);
vis[s]=true,cnt[s]=,dis[s]=;
while(!q.empty()){
int cur=q.front();
q.pop();
vis[cur]=false;
for(int i=head[cur];~i;i=edge[i].next){
int v=edge[i].to;
if(dis[v]>dis[cur]+edge[i].val){
dis[v]=dis[cur]+edge[i].val;
if(!vis[v]){
vis[v]=true;
if(++cnt[v]>n)return -; //进队列次数>n,说明存在负环,直接返回-1
q.push(v);
}
}
}
}
if(dis[n]==INF)return -; //如果两点不连通,说明1、n两点之间没有约束条件,所以1、n可以距离任意远,返回-2
return dis[n];
}
int main(){
while(scanf("%d%d%d",&n,&ml,&md)!=EOF){
init();
for(int i=;i<=n;i++)add(i,i-,); //代表s[i-1]-s[i]<=0
for(int i=;i<=ml;i++){
int u,v,c;scanf("%d%d%d",&u,&v,&c);
add(u,v,c); //v-u<=c
}
for(int i=;i<=md;i++){
int u,v,c;scanf("%d%d%d",&u,&v,&c);
add(v,u,-c); //u-v<=-c,即v-u>=c
}
//利用题目条件,整合成三个差分约束条件,利用这几个条件建图,然后跑一遍最短路
printf("%d\n",spfa());
}
}
2018-10-11
POJ 3169 Layout 【差分约束】+【spfa】的更多相关文章
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- POJ 3169 Layout (差分约束)
题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个, ...
- POJ 3169 Layout(差分约束啊)
题目链接:http://poj.org/problem? id=3169 Description Like everyone else, cows like to stand close to the ...
- poj 3169 Layout 差分约束模板题
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6415 Accepted: 3098 Descriptio ...
- POJ 3169 Layout(差分约束 线性差分约束)
题意: 有N头牛, 有以下关系: (1)A牛与B牛相距不能大于k (2)A牛与B牛相距不能小于k (3)第i+1头牛必须在第i头牛前面 给出若干对关系(1),(2) 求出第N头牛与第一头牛的最长可能距 ...
- poj Layout 差分约束+SPFA
题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...
- ShortestPath:Layout(POJ 3169)(差分约束的应用)
布局 题目大意:有N头牛,编号1-N,按编号排成一排准备吃东西,有些牛的关系比较好,所以希望他们不超过一定的距离,也有一些牛的关系很不好,所以希望彼此之间要满足某个关系,牛可以 ...
- POJ-3169 Layout (差分约束+SPFA)
POJ-3169 Layout:http://poj.org/problem?id=3169 参考:https://blog.csdn.net/islittlehappy/article/detail ...
- poj 3169&hdu3592(差分约束)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9687 Accepted: 4647 Descriptio ...
- POJ——1364King(差分约束SPFA判负环+前向星)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11946 Accepted: 4365 Description ...
随机推荐
- 处理数据库 Ora-00845: memory_traget not supported on this system 的错误
问题出现情况:在数据库启动的时候:如果出现如下图的错误: 查看官方文档: 处理操作步骤: [oracle@localhost orcl]$ su - root Password: [root@loca ...
- Confluence 6 管理协同编辑 - 修改编辑模式
编辑模式确定了你站点所有用户使用协同编辑的体验,这个是你对协同编辑进行启用和关闭的地方. 希望修改编辑模式: 进入 > 基本配置(General Configuration) > 协同编 ...
- Confluence 6 基于 Confluence 数据中心的 SAML 单点登录
安全申明标记语言(Security Assertion Markup Language (SAML))是一个基于 XML 的数据格式,允许各个软件平台通过identity provider (IdP) ...
- java多线程快速入门(十九)
如何停止线程 1.使用stop方法强行终止线程(这个方法不推荐使用,可能会出现业务操作未执行完,线程中断了) package com.cppdy; class MyThread15 extends T ...
- 状态压缩dp小结
最近一段时间算是学了一些状态压缩的题目,在这里做个小结吧 首先是炮兵布阵类题目,这类题目一开始给定一个矩形,要求在上面放置炮兵,如果在一格放了炮兵那么周围的某些格子就不能放炮兵,求最大能放置炮兵的数量 ...
- 51nod1158 最大子矩形 单调栈应用
#include<iostream> #include<cstring> #include<cstdio> using namespace std; ][6],m, ...
- Jmeter-JDBC Request参数化
一.参数化 1.选择Query Type(查询类型)为Prepared Select Statement 2.写好sql 3.在Parameter Values中输入参数,多个参数用‘,’隔开 4.P ...
- C++ Primer 笔记——union
1.union是一种特殊的类.一个union可以有多个数据成员,但是在任意时刻,只有一个数据成员可以有值.当我们给union的某个成员赋值之后,该union的其他成员就变成未定义的状态了.分配给一个u ...
- 将labelme 生成的.json文件进行可视化的代码+label.png 对比度处理的matlab代码
labelme_to_dataset 指令的代码实现: show.py文件 #!E:\Anaconda3\python.exe import argparse import json import o ...
- windows客户端走代理上网
前提:在大型网络中,由于众多服务器及安全性考虑,内网服务器是不能上外网的,但是为了满足某些服务的需要,一定会搭建代理服务器的. 以下是windows客户端走代理服务器的操作: 两下确定就可 ...