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. 【,NetCore】WebApi使用统一时间格式

    1.在Startup中配置统一时间格式 services.AddMvc() .AddJsonOptions(options => { //配置时间序列化格式 options.Serializer ...

  2. notepad++ 快捷键运行python程序目录存在空格的问题

    通常情况下 cmd /k (python.exe文件所在路径) "$(FULL_CURRENT_PATH)"&PAUSE&EXIT 就ok了,路径里有空格就不一样了 ...

  3. HashMap底层源码剖析

    HashMap底层源码剖析 一.HashMap底层用到的数据结构 数组+单向链表+红黑树 数组:数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:当法神hash碰撞时,首先会找到数组对应位 ...

  4. 手动搭建webpack + vue项目之初体验

    在使用vue做开发时,大部分人只会使用官方提供的脚手架搭建项目,脚手架虽然很好用,但想要成为一名优秀的前端开发者,webpack这一道坎是绕不开的,所以我们要学会脱离脚手架,利用webpack手动搭建 ...

  5. 聊聊order by的工作机制

    总结写在前面: 1. 介绍了orderBy的两种算法流程:全字段排序 和 rowid排序. 2. rowid排序 相比 全字段排序,参与排序字段较少,耗内存较少,多一步回表,如果内存够的情况下MySQ ...

  6. js获取按钮的文字

    button按钮有两种情况: 1 <input type="button" id="button" value="button"> ...

  7. 44. 更改oracle字符集编码american_america.zh16gbk 改为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    注册表NLS_LANG值改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  8. spring boot devtools热部署

    问题1: Springloaded 在springboot2的maven的pom.xml 无法找到 解决方法:在idea通过View->Tool Windows->Maven Projec ...

  9. [剑指offer]14-1.剪绳子

    14-1.剪绳子 方法一 动态规划 思路:递归式为f(n)=max(f(i), f(n-i)),i=1,2,...,n-1 虽然我现在也没有彻底明白这个递归式是怎么来的,但用的时候还是要注意一下.f( ...

  10. JDK14的新特性-Switch新功能

    2020年3月17日,Oracle正式发布了JDK14版本,共新增了16项新特性 本文重点写一下关于switch的新功能: switch 表达式扩展了 switch 语句,使其不仅可以作为语句(sta ...