O - Layout(差分约束 + spfa)
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)的更多相关文章
- POJ-3169 Layout (差分约束+SPFA)
POJ-3169 Layout:http://poj.org/problem?id=3169 参考:https://blog.csdn.net/islittlehappy/article/detail ...
- poj Layout 差分约束+SPFA
题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...
- 【poj3169】【差分约束+spfa】
题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...
- 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,差分约束+SPFA。
Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...
- poj 3169 Layout(差分约束+spfa)
题目链接:http://poj.org/problem?id=3169 题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有m ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
- 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长 ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...
随机推荐
- C#如何实现大小写转换
2020-03-16 每日一例第8天 1.新建窗体应用程序,拖入label/textbox/radiobutton控件,并改text值: 2.button控件输入代码: if (radioButt ...
- HashMap底层源码剖析
HashMap底层源码剖析 一.HashMap底层用到的数据结构 数组+单向链表+红黑树 数组:数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:当法神hash碰撞时,首先会找到数组对应位 ...
- JetBrains Quest 3
起因 今天早上看了一篇博文: 此时的我:"哎,这等好事不等我!" 然后......我打开官方推特: "什么?最后的任务?" 于是就有了这篇文章 开始操作 1.神 ...
- Java 内存模型都不会,就敢在简历上写熟悉并发编程吗
从 PC 内存架构到 Java 内存模型 你知道 Java 内存模型 JMM 吗?那你知道它的三大特性吗? Java 是如何解决指令重排问题的? 既然CPU有缓存一致性协议(MESI),为什么 JMM ...
- ASP.NET MVC5实现芒果分销后台管理系统(一):系统结构设计,集成AutoMapper,Log4net
在构思完系统思维脑图后,小墨回到家中,便摩拳擦掌开始了开发工作.要想迅速完成系统开发,前期系统设计和准备尤其重要,因为小墨做过太多大大小小的业务系统,准备工作也是十分顺利. 系统结构 整个系统工程结构 ...
- EPX Studio开发平台简介
大家问我最多的问题就是“EPX 是什么?”“EPX 能够用来做什么?”“EPX 有什么优势?”“EPX 与其它开发平台的区别是什么?” 问题林林总总,总也回答不完,希望通过正文前面的这段文字,来简要回 ...
- 使用Jmeter进行压力测试结果偏差较大原因分析
Apache软件基金会(ASF)是一家总部位于美国的非营利性慈善组织.ASF的所有产品都通过公共论坛的在线协作开发,并从美国境内的中央服务器分发.Jmeter是ASF的一款开源免费软件 ,在国内被很多 ...
- 是的,GitHub APP 终于上线了
是的,全球最大程序员社交网站的 App 今天正式上线了,早在 GitHub 2019 开发者大会说要出的客户端,那会儿还需要申请. 兴致勃勃去申请了,然后就是等,这一等就是四五月,黄花菜都凉了,今天终 ...
- springboot基础-redis集群
一.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- 【转载】oracle的安装和配置
转自: https://blog.csdn.net/weixin_40364885/article/details/80787472 一.概念 oracle在使用的时候时是不收费的,如果你要在工作中来 ...