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 ...
随机推荐
- Springboot 事务处理常见坑点
使用事务注解@Transactional 之前,应该先了解它的相关属性,避免在实际项目中踩中各种各样的坑点. 常见坑点1:遇到非检测异常时,事务不开启,也无法回滚. 例如下面这段代码,账户余额依旧增加 ...
- Confluence 6 内存使用和需求和一些问题
系统备份和恢复 Confluence 的备份和恢复是与数据库中数据量的大小有关.这个操作可能会对 Confluence 的性能产生很多关键性的影响并且大量消耗内存.如果你在 Confluence 的 ...
- Guideline 5.2.1 - Legal - Intellectual Property 解决方案
最近在上架公司公司项目的时候遇到这个问题什么5.2.1 然后去了解发现最近不少人都遇到了这个问题.先说一下 我上架的APP是一个医疗的APP然后说需要什么医疗资质,估计是账号的公司资质不够吧.后面和苹 ...
- 【Web】servlet、filter和listener
一般地,servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是:context-param -> listener -> filter -&g ...
- ionic3 更新打开apk android 8.0报错
项目中安卓强制更新,当文件下载完.在android 8.0中不能打开apk包. 引入插件报一下错误 import { FileOpener } from '@ionic-native/file-ope ...
- js中的 !! 和 ! 的区别
简单描述:看老大提交的代码,发现了一个事情,有一处是连着两个! 然后就把我弄纳闷了,果断找度娘,原来如此.上代码 代码: if(!!s && s.length > 0){ /* ...
- C++ Primer 笔记——const 限定符
1.因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化. 2.默认情况下const对象只在文件内有效,如果想在多个文件之间共享const对象,必须在变量的定义之前添加exter ...
- Django 基模板布局设置
Django 基模板布局设置 基模板 定义基础模板一般分为三块,css部分,body部分,js部分 将基础统一的部分写在基础模板中 差异部分直接 引用 {% block css %}{% endblo ...
- C#算法 选择排序、冒泡排序、插入排序
1.冒泡排序: 方法一: public static int[] MaoPao(int[] arr) { //执行多少次 for (int i = 0; i < arr.Length; i++) ...
- vs无法启动程序,操作在当前状态中是非法的
问题的图片: 解决方案: 工具--选项--调试--常规--启用asp.net的JavaScript调试(chrome和ie)去掉勾选