O - Layout(差分约束 + spfa)

Like everyone else, cows like to stand close to their friends when

queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1…N

standing along a straight line waiting for feed. The cows are standing

in the same order as they are numbered, and since they can be rather

pushy, it is possible that two or more cows can line up at exactly the

same location (that is, if we think of each cow as being located at

some coordinate on a number line, then it is possible for two or more

cows to share the same coordinate).

Some cows like each other and want to be within a certain distance of

each other in line. Some really dislike each other and want to be

separated by at least a certain distance. A list of ML (1 <= ML <=

10,000) constraints describes which cows like each other and the

maximum distance by which they may be separated; a subsequent list of

MD constraints (1 <= MD <= 10,000) tells which cows dislike each other

and the minimum distance by which they must be separated.

Your job is to compute, if possible, the maximum possible distance

between cow 1 and cow N that satisfies the distance constraints. Input

Line 1: Three space-separated integers: N, ML, and MD.

Lines 2…ML+1: Each line contains three space-separated positive

integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at

most D (1 <= D <= 1,000,000) apart.

Lines ML+2…ML+MD+1: Each line contains three space-separated positive

integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at

least D (1 <= D <= 1,000,000) apart. Output Line 1: A single integer.

If no line-up is possible, output -1. If cows 1 and N can be

arbitrarily far apart, output -2. Otherwise output the greatest

possible distance between cows 1 and N.

Sample Input
4 2 1
1 3 10
2 4 20
2 3 3
Sample Output
27

Hint Explanation of the sample:

There are 4 cows. Cows #1 and #3 must be no more than 10 units apart,

cows #2 and #4 must be no more than 20 units apart, and cows #2 and #3

dislike each other and must be no fewer than 3 units apart.

The best layout, in terms of coordinates on a number line, is to put

cow #1 at 0, cow #2 at 7, cow #3 at 10, and cow #4 at 27.

思路

  • 差分约束,让求最大答案,把所有给的不等式 转化为" <= " , 跑最短路径

题解(171ms)

#include<iostream>
#include<queue>
#include<cstring>
using namespace std; #define INF 0x3f3f3f3f
const int maxn = 10005;
const int maxm = 200005;
int n,a,b;
struct Edge
{
int v,w,next;
} edge[maxm];
int head[maxn], dis[maxn];
int use[maxn];
int k = 0; void Add(int u,int v,int w)
{
edge[++ k] = (Edge){ v, w, head[u]}; head[u] = k;
} bool Spfa(int s, int e)
{
int cnt[maxn] = {0};
for(int i = 0; i <= n; i ++)
dis[i] = INF;
dis[s] = 0;
queue<int> q;
q.push(s);
int u,v,w;
while(! q.empty())
{
u = q.front(); q.pop();
use[u] = 0;
cnt[u] ++;
if(cnt[u] > n + 1) return false; for(int i = head[u]; i; i = edge[i].next)
{
v = edge[i].v;
w = edge[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(! use[v])
{
q.push(v);
use[v] = 1;
}
}
}
}
return true;
} int main()
{
ios::sync_with_stdio(false); cin.tie(0);
//freopen("T.txt","r",stdin);
cin >> n >> a >> b;
int u,v,w;
for(int i = 1; i <= a; i ++)
{
cin >> u >> v >> w;
Add(u, v, w);
}
for(int i = 1; i <= b; i ++)
{
cin >> u >> v >> w;
Add(v, u,-w);
}
if(Spfa(1, n))
{
if(dis[n] == INF) cout << -2 << endl;
else cout << dis[n] << endl;
}
else
cout << -1 << endl; return 0;
}
//分析:让求的事最大距离 -> 跑最短路

kuangbin的题解(47ms)

/*
POJ 3169 Layout 差分约束+SPFA
*/
//队列实现SPFA,需要有负环回路判断
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std; const int MAXN=1010;
const int MAXE=20020;
const int INF=0x3f3f3f3f;
int head[MAXN];//每个结点的头指针
int vis[MAXN];//在队列标志
int cnt[MAXN];//每个点的入队列次数
int que[MAXN];//SPFA循环指针
int dist[MAXN]; struct Edge
{
int to;
int v;
int next;
}edge[MAXE];
int tol;
void add(int a,int b,int v)//加边
{
edge[tol].to=b;
edge[tol].v=v;
edge[tol].next=head[a];
head[a]=tol++;
}
bool SPFA(int start,int n)
{
int front=0,rear=0;
for(int v=1;v<=n;v++)//初始化
{
if(v==start)
{
que[rear++]=v;
vis[v]=true;
cnt[v]=1;
dist[v]=0;
}
else
{
vis[v]=false;
cnt[v]=0;
dist[v]=INF;
}
}
while(front!=rear)
{
int u=que[front++];
vis[u]=false;
if(front>=MAXN)front=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(dist[v]>dist[u]+edge[i].v)
{
dist[v]=dist[u]+edge[i].v;
if(!vis[v])
{
vis[v]=true;
que[rear++]=v;
if(rear>=MAXN)rear=0;
if(++cnt[v]>n) return false;
//cnt[i]为入队列次数,用来判断是否存在负环回来
//这条好像放在这个if外面也可以??
}
}
}
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
int ML,MD;
int a,b,c;
while(scanf("%d%d%d",&n,&ML,&MD)!=EOF)
{
tol=0;//加边计数,这个不要忘
memset(head,-1,sizeof(head));
while(ML--)
{
scanf("%d%d%d",&a,&b,&c);
if(a>b)swap(a,b);//注意加边顺序
add(a,b,c);
//大-小<=c ,有向边(小,大):c
}
while(MD--)
{
scanf("%d%d%d",&a,&b,&c);
if(a<b)swap(a,b);
add(a,b,-c);
//大-小>=c,小-大<=-c,有向边(大,小):-c
}
if(!SPFA(1,n)) printf("-1\n");//无解
else if(dist[n]==INF) printf("-2\n");
else printf("%d\n",dist[n]);
}
return 0;
}

O - Layout(差分约束 + spfa)的更多相关文章

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

    POJ-3169 Layout:http://poj.org/problem?id=3169 参考:https://blog.csdn.net/islittlehappy/article/detail ...

  2. poj Layout 差分约束+SPFA

    题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...

  3. 【poj3169】【差分约束+spfa】

    题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...

  4. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  5. (简单) POJ 3169 Layout,差分约束+SPFA。

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

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

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

  7. poj3159 差分约束 spfa

    //Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...

  8. 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长 ...

  9. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

随机推荐

  1. Go coding in go way(用Go的思维去coding)

    本文是Tony Bai在2017年第三届GopherChina大会上所作,来源如下 https://tonybai.com/2017/04/20/go-coding-in-go-way/ 一.序 今天 ...

  2. Redis面试题集锦(精选)

    1.什么是 Redis?简述它的优缺点? Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value 类型的内存数据库,很像memcached,整个数据库统统 ...

  3. sf-git机制

    为什么要专门写一篇关于sf科技公司的GIT管理机制呢?因为本周经历了两天的学习和考试,刚开始没在意,因为之前公司也用的GIT,所以没怎么看视频,就看了文档,练习考试时候才发现并非以前的那种git流程, ...

  4. 使用python3编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。

    代码如下: import random n = 0 sum = 0 while n < 10: num = random.randint(1, 100) sum = sum + num n += ...

  5. TCP数据报结构以及三次握手(图解)

    简要介绍 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接.客户端在收发 ...

  6. 解决Ajax中IE浏览器缓存问题

    解决Ajax中IE浏览器缓存问题 1.首先,先看一张图.从这张图中我们可以清楚的了解到从请求的发出到解析响应的过程. 2.根据图中的三个节点我们可以使用三种方式解决这个缓存问题(主要是针对ie) 2. ...

  7. 解决mongo单文档超过16M

    mongodb导入大文件的数据时,导入一小部分后,提示lost connect,失去连接.mongo文件有6.3G,网上查了一下,原来Mongo对单次处理好像有大小限制(16m),所以大文件会出问题, ...

  8. 【WPF学习】第五十九章 理解控件模板

    最近工作比较忙,未能及时更新内容,敬请了解!!! 对于可视化树的分析引出了几个有趣问题.例如,控件如何从逻辑树表示扩张成可视化树表示? 每个控件都有一个内置的方法,用于确定如何渲染控件(作为一组更基础 ...

  9. 【Weiss】【第03章】练习3.9:大整数运算包

    [练习3.9] 编写任意精度的整数运算包,要求使用类似多项式运算的方法.计算24000内数字0到9的分布.

  10. Natas17 Writeup(sql盲注之时间盲注)

    Natas17: 源码如下 /* CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) ...