题目链接:https://cn.vjudge.net/problem/POJ-3169

题意

Farmer John手下的一些牛有自己喜欢的牛,和讨厌的牛

喜欢的牛之间希望距离在给定距离D之内

讨厌的牛之间希望距离在给定距离D之外

每个牛都有一个编号,编号较小的牛要在编号较大的牛之前(坐标可以重叠)

如果不存在这样的队伍,输出-1

如果一号和n号可以随意距离,输出-2

否则输出一号和n号最近距离

思路

首先满足 X_i<X_j

如果两个牛互相喜欢,则有

$ X_i<=X_j+D $ 满足最短路

如果两个牛互相讨厌,则有

$ X_i>=X_j+D $ 经过变形(刚看到的单词subsitution就是这个意思)

$ X_j<=X_i-D$ 满足最短路

然后直接写就好

注意虽然满足编号小的在前,但不要去对dis数组做判断

因为有些节点就没有被更新(没有对应的边)

详情见注释

提交过程

CE Edge没写构造函数
TLE 模板写错了一个符号,导致Bellman没出来哈哈
WA1 对dis数组做了判断
AC1 去掉判断
WA2 怀疑是判断有问题,试了试
AC2 加了行注释

代码

#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e3+20, maxm=2e6+20;
const long long INF=1LL<<60;
struct Edge{
int to, dis, next;
Edge(int to=0, int dis=0, int next=0):
to(to), dis(dis), next(next) {}
}edges[maxm*2+5];
int head[maxn+5], size; long long Bellman(int n){
long long dist[maxn+5];
int cnt[maxn+5]={0};
bool inq[maxn+5]={false};
stack<int> sta;// queue<int> que; for (int i=0; i<=n; i++) dist[i]=INF; dist[1]=0;
inq[1]=true;
sta.push(1);// que.push(1);
while (sta.size()){
int from=sta.top(); sta.pop();
inq[from]=false; for (int i=head[from]; i!=-1; i=edges[i].next){
Edge &e=edges[i];
int &to=e.to, &dis=e.dis; if (dist[to]<=dist[from]+(long long)dis) continue;
dist[to]=dist[from]+(long long)dis; if (inq[to]) continue;
sta.push(to); if (++cnt[to]>=n) return -1;
}
} if (dist[n]==INF) return -2;
// for (int i=2; i<=n; i++) // does it work?
// if (dist[i]<dist[i-1]) return -1;
//
// Obviously not, we only need to find a way to the point n
// So there may be same points which value INF
// (But it surely values between dist[i-1] and dist[i+1])
return dist[n];
} void init(void){
memset(head, -1, sizeof(head));
size=0;
} void addEdge(int from, int to, int dis){
edges[size]=Edge(to, dis, head[from]);
head[from]=size++;
} int main(void){
int n, ml, md;
int from, to, dis; init();
scanf("%d%d%d", &n, &ml, &md);
for (int i=0; i<ml; i++){
scanf("%d%d%d", &from, &to, &dis);
if (from>to) swap(from, to);
addEdge(from, to, dis);
}
for (int i=0; i<md; i++){
scanf("%d%d%d", &from, &to, &dis);
if (from<to) swap(from, to);
addEdge(from, to, -dis);
}
printf("%lld\n", Bellman(n)); return 0;
}
Time Memory Length Lang Submitted
422ms 47188kB 1961 C++ 2018-06-06 23:04:35

POJ-3169 Layout 最短路 差分约束的更多相关文章

  1. POJ 3169 Layout (spfa+差分约束)

    题目链接:http://poj.org/problem?id=3169 题目大意:n头牛,按编号1~n从左往右排列,可以多头牛站在同一个点,给出ml行条件,每行三个数a b c表示dis[b]-dis ...

  2. POJ 3169 Layout (图论-差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6574   Accepted: 3177 Descriptio ...

  3. poj 3169 Layout(线性差分约束,spfa:跑最短路+判断负环)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15349   Accepted: 7379 Descripti ...

  4. Candies POJ - 3159 (最短路+差分约束)

    During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher b ...

  5. POJ 3169.Layout 最短路

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11612   Accepted: 5550 Descripti ...

  6. POJ 3169 Layout(差分约束+最短路)题解

    题意:有一串数字1~n,按顺序排序,给两种要求,一是给定u,v保证pos[v] - pos[u] <= w:二是给定u,v保证pos[v] - pos[u] >= w.求pos[n] - ...

  7. POJ 3169 Layout (spfa+差分约束)

    题目链接:http://poj.org/problem?id=3169 差分约束的解释:http://www.cnblogs.com/void/archive/2011/08/26/2153928.h ...

  8. POJ 3169 Layout (HDU 3592) 差分约束

    http://poj.org/problem?id=3169 http://acm.hdu.edu.cn/showproblem.php?pid=3592 题目大意: 一些母牛按序号排成一条直线.有两 ...

  9. poj 3169 Layout(差分约束+spfa)

    题目链接:http://poj.org/problem?id=3169 题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有m ...

随机推荐

  1. 哪里获取ZBrush简体中文版?

    ZBrush®精简版(ZBrush简体中文版)ZBrushCore发布已经有一段日子了,相信不少人早已迫不及待地开始尝试了,不知道你们的体验如何?毋庸置疑的是,ZBrushCore专为刚接触3D并希望 ...

  2. 第二章 Python数据类型详解

    基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...

  3. JS判断客户端是否是iOS或者Android或者ipad(三)

     *  * @function: 判断浏览器类型是否是Safari.Firefox.ie.chrome浏览器  * @return: true或false  *  */ function isSafa ...

  4. 记一次mybatis<if>标签的问题

    前言 到底还是没理解清楚的锅~~~~搞了好久...啊啊啊啊 错误: There is no getter for property named 'name' in 'class java.lang.L ...

  5. Jmeter中模拟多用户执行多场景操作

    1.其实一个用户组就是一个场景(Thread Group).可以在一个测试计划中进行多个场景的执行,在测试计划下加一个全局的User Defined Variables,在这个里面可以设置执行总数to ...

  6. js(Mandango:壮汉专用,电影院划位工具)

    Mandango:壮汉专用,电影院划位工具 <body onload="initSeats();"> <div style="margin-top:75 ...

  7. NOI 2011 阿狸的打字机 (AC自动机+dfs序+树状数组)

    题目大意:略(太长了不好描述) 良心LOJ传送门 先对所有被打印的字符串建一颗Trie树 观察数据范围,并不能每次打印都从头到尾暴力建树,而是每遍历到一个字符就在Trie上插入这个字符,然后记录每次打 ...

  8. [LUOGU]3919 【模板】可持久化数组

    用可持久化线段树维护可持久化数组.可持久化线段树见之前发的主席树模板 #include <iostream> #include <cstdio> #include <cs ...

  9. [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)

    c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...

  10. python hashlib、configparse、logging

    一.hashlib 1.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等.     2.摘要算法 通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目 ...