PKU 3169 Layout(差分约束系统+Bellman Ford)
题目大意:原题链接
当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食。奶牛排在队伍中的顺序和它们的编号是相同的。因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上(即间距可能为0)。即是说,如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。
一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D。给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶牛间存有反感的描述。(1<=ML,MD<=10000,1<=L,D<=1000000)
你的工作是:如果不存在满足要求的方案,输出-1;如果1号奶牛和N号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1号奶牛和N号奶牛间可能的最大距离。
解题思路:参考链接(个人认为解释的相当到位)
先介绍一下负权回路:在一个图里每条边都有一个权值(有正有负)
如果存在一个环(从某个点出发又回到自己的路径),而且这个环上所有权值之和是负数,那这就是一个负权环,也叫负权回路。
存在负权回路的图是不能求两点间最短路的,因为只要在负权回路上不断兜圈子,所得的最短路长度可以任意小。
对于任意i号奶牛,1<=i<=N,在距离上应该满足:d[i+1]-d[i]>=0(//所以得保持方向一致,始终从1指向N)
对于每个好感的描述(i,j,w),假设i<=j,体现到距离上的要求就是:d[j]-d[i]<=w
对于每个反感的描述(i,j,w),假设i<=j,体现到距离上的要求就是:d[j]-d[i]>=w
1.(假设v>u),则对于差分不等式v-u<=w,建一条u到v的权值为w的边,取的是最大值,求的是最短路,得到的是最大值(本题求的就是最大值);
对于不等式 u-v>=w,建一条从v到u的权值为-w的边,仍然取的是最大值,求的是最短路,得到的是最大值。
每次都是取的最大值朝同一个方向(从编号小的指向大的)建图。如果反感,这时距离是两头牛间的最小距离,当权值变为相反数后,
反而变成最大距离(因为如果距离更大的话取相反数后数值更小,编号为1~N奶牛之间可能的最大距离也就更短,这样不符合题意)
2.如果进行n-1次更新结束后仍然检测到负环,那么无解。
3.如果进行n-1次更新结束后d[n]没有更新,那么可以是任意解。
问题1.问题是否有解等价于图G是否没有负权回路?
证明:若G中无负权回路,我们可以求出v1其他顶点u的最短路长,设为d(u)。由于是最短路,因此对于任意边e=uv,有d(u)+w(e)>=d(v)(否则d[u]一定还能更新)
从而所有的约束条件都被满足,问题一定有解。若G中有负权回路,说明在任何时刻,G中至少有一个点v的最短路长还可以更新,因此必须存在一条边e=uv,
使得d(u)+w(e)<d(v)。所以无论何时,都会有某个约束条件不被满足,问题无解。(证毕)
问题2.若运行Bellman-Ford后,标号为N的顶点的最短路估计值仍为充分大,那么N和1的距离可以任意大?
证明:从刚才的操作可以看出,到了这一步,已经把含有负权回路的情况排除掉了。在图G中,该充分大的值比可能得到的最大距离(原图中最大的边权×顶点数)大,
因为只要无环,每个顶点最多只会被经过一次,跑出的最短距离肯定比这个值小,所以我们可以把这个值看作是无穷大
因此,它和任意大的值对于G的效果都是一样的(同样大于合法的最大距离)。由于充分大的值在G中满足约束(因为通过约束条件建图后跑出来的最短路肯定是满足约束的)
所以任意大的值亦满足约束,从而距离可以任意大。(证毕)
问题3.若运行Bellman-Ford后,标号为N的顶点的最短路估计值比充分大小,那么它是N和1可能的最大距离?
证明:设D[i]是顶点i和1的最短路径估计值,d[i]是顶点i和1可能的最大距离。
运用反证法,我们首先证明,d[n]<=D[n]。
假设d[n]>D[n],那么在Bellman-Ford运行之前,将赋予每个顶点i的充分大的值换成对应的d[i]。由于d本身满足所有约束条件,所以运行后,得出D'=d。由于充分大的值比所有d[i]都大,而求最短路运用的是逐步松弛操作,我们设立一个更大的初值不可能导致我们的终值反而更小。所以对于任意i,必定有D[i]>=D'[i],即有D[n]>=d[n],这与我们的假设矛盾。
然后我们证明,d[n]>=D[n]。
根据d[i]的定义,它是i和1的可能最大距离。由于D[i]是满足题目的所有约束的(因为D[i]是根据约束条件建图后跑最短路得到的结果肯定满足约束条件),所以D[i]是顶点i和1可能的距离之一。
如果D[i]>d[i],那么与d[i]的定义矛盾。
综合上述,有D[i]=d[i]。从而D[n]是n和1可能的最大距离。(证毕)
运行Bellman-Ford最坏情况下的复杂度是O((ML+MD)*N)=O(2*107),可以在规定时间内解出。
题目中的相邻点距为① -7->② -3->③ -17->④便是答案,完全符合题目要求
#include<cstdio>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
struct node
{
int u,v;
int w;
}edge[];
int n,m;
int tot=,d[]; void Add(int u,int v,int w)
{
edge[tot].u=u;
edge[tot].v=v;
edge[tot++].w=w;
}
int Bellman_Ford()
{
for(int i=;i<=n;i++)
d[i]=inf;
d[]=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
int u=edge[j].u;
int v=edge[j].v;
int w=edge[j].w;
if(d[u]<inf&&d[u]+w<d[v])
d[v]=d[u]+w;
}
}
for(int j=;j<m;j++){//检测负环
int u=edge[j].u;
int v=edge[j].v;
int w=edge[j].w;
if(d[u]<inf&&d[u]+w<d[v])
return ;
}
return ;
} int main(){
int ml,md,u,v,w;
scanf("%d%d%d",&n,&ml,&md);
m=ml+md;
for(int i=;i<ml;i++){
scanf("%d%d%d",&u,&v,&w);
if(u>v) swap(u,v);//保持方向一致,始终从1指向N
Add(u,v,w);
}//好感d[v]-d[u]<=w
for(int i=;i<md;i++){
scanf("%d%d%d",&u,&v,&w);
if(u>v) swap(u,v);
Add(v,u,-w);
}//反感d[v]-d[u]>=w
if(!Bellman_Ford()) printf("-1\n");
else if(d[n]==inf) printf("-2\n");
else printf("%d\n",d[n]);
}
PKU 3169 Layout(差分约束系统+Bellman Ford)的更多相关文章
- POJ 3169 Layout 差分约束系统
介绍下差分约束系统:就是多个2未知数不等式形如(a-b<=k)的形式 问你有没有解,或者求两个未知数的最大差或者最小差 转化为最短路(或最长路) 1:求最小差的时候,不等式转化为b-a>= ...
- poj 3169 Layout 差分约束模板题
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6415 Accepted: 3098 Descriptio ...
- POJ 3169 Layout(差分约束啊)
题目链接:http://poj.org/problem? id=3169 Description Like everyone else, cows like to stand close to the ...
- POJ3169 Layout(差分约束系统)
POJ3169 Layout 题意: n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛 ...
- 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 (差分约束)
题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个, ...
- Bellman-Ford算法:POJ No.3169 Layout 差分约束
#define _CRT_SECURE_NO_WARNINGS /* 4 2 1 1 3 10 2 4 20 2 3 3 */ #include <iostream> #include & ...
- PKU 1201 Intervals(差分约束系统+Spfa)
题目大意:原题链接 构造一个集合,这个集合内的数字满足所给的n个条件,每个条件都是指在区间[a,b]内至少有c个数在集合内.问集合最少包含多少个点.即求至少有多少个元素在区间[a,b]内. 解题思路: ...
- POJ 3169 Layout(差分约束 线性差分约束)
题意: 有N头牛, 有以下关系: (1)A牛与B牛相距不能大于k (2)A牛与B牛相距不能小于k (3)第i+1头牛必须在第i头牛前面 给出若干对关系(1),(2) 求出第N头牛与第一头牛的最长可能距 ...
随机推荐
- pl/sql developer导出数据到excel的方法
http://yedward.net/?id=92 问题说明:使用pl/sql developer导出数据到excel表格中是非常有必要的,一般的可能直接在导出的时候选择csv格式即可,因为该格式可以 ...
- iOS开发之--iOS APP打包的时候出现的四个选项
- C语言while语句
在C语言中,共有三大常用的程序结构: 顺序结构:代码从前往后执行,没有任何“拐弯抹角”: 选择结构:也叫分支结构,重点要掌握 if else.switch 以及条件运算符: 循环结构:重复执行同一段代 ...
- Math.max得到数组中最大值
Math.max(param1,param2) 因为参数不支持数组. 所以可以根据apply的特点来解决, var max = Math.max.apply(null,array),这样就可以轻易的得 ...
- linux的/etc/hosts的作用
转自:http://blog.chinaunix.net/uid-28559065-id-4145820.html linux /etc/hosts文件作用 分类: LINUX linux /e ...
- ios开发 更改状态栏
设置statusBar 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UIStatusBarS ...
- Netty进行RPC服务器的开发 需要考虑的问题
谈谈如何使用Netty开发实现高性能的RPC服务器 - Newland - 博客园 http://www.cnblogs.com/jietang/p/5615681.html 如何实现.基于什么原理? ...
- 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信
1.协程并发:切+保存状态单线程下实现并发:协程 切+ 保存状态 yield 遇到io切,提高效率 遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切 相当于骗操作系统 一直处于计算协程 ...
- HBase简单API
一.使用IDEA的maven工程,工程结构如下: 二.maven的依赖pom.xml文件 <?xml version="1.0" encoding="UTF-8&q ...
- 如何缩减手游app安装包的大小?
包体过大对手游的影响更是诟病已久,有具体数据证明,游戏包体越大,在游戏运营推广过程中游戏用户的转化率就越低:反之,游戏包体越小,游戏用户的下载转化率就越高(如下图),所有的手机app.游戏在大版本更新 ...