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\)列整体加了多少权值, ...
随机推荐
- I - A计划 HDU - 2102
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- (数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色
本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...
- Button相关设置
2020-03-11 每日一例第4天 1.添加按钮1-6,并修改相应的text值: 2.窗体Load事件加载代码: private void Form1_Load(object sender, Ev ...
- c 将年月日转化为星期
/*得到年月日转化为星期几*/ LOCAL ulong_t DateWeekGet(ulong_t year,ulong_t month,ulong_t day) { ulong_t c = ; ul ...
- Spark实战--搭建我们的Spark分布式架构
Spark的分布式架构 如我们所知,spark之所以强大,除了强大的数据处理功能,另一个优势就在于良好的分布式架构.举一个例子在Spark实战--寻找5亿次访问中,访问次数最多的人中,我用四个spar ...
- MVC超链接调用控制器内的方法
<a href="hello/Layout?name=Tom"><h1><span>Hello</span>World</h1 ...
- Linux系统之LNMP及nginx反向代理实现
1.编译安装LNMP,并安装wordpress 首先准备环境,编译安装LNMP可以是多台主机,也可以是单台主机,把nginx,mysql,php都集中安装在一个主机上:我这里以一台主机为例吧!! 一. ...
- Python第二周作业
绘制五角星 import turtle turtle.color('black','red') turtle.pensize(10) turtle.begin_fill() for i in rang ...
- 「newbee-mall新蜂商城开源啦」GitHub 上最热门的 Spring Boot 项目,我也要做一次靓仔!
没有一个冬天不可逾越,也没有一个春天不会到来. 介绍一下新蜂商城的近况,同时,新蜂商城 Vue 版本目前也在开发中,在这篇文章里我也向大家公布一下新蜂商城 Vue 版本的开发进度,和大家同步一下,在不 ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...