摘要:
POJ_3159 一开始我想多了,有段时间就在想如果图不连通该添加一些什么约束条件。但后来突然发现,如果最后N和1不连通的话,那么这个题就无解了,想到这,题目就变的简单了,因为只有一个约束条件,d[A]-d[B]>=-c,然后将d[1]看做0,以1为起点求一个到N的最短路就可以了。 此外,这个题在用SPFA的时候,如果用循环队列会超时,而用栈就没有问题,具体的原理我也不清楚。#include<stdio.h>#include<string.h>int first[31000],next[151000],v[151000],w[151000];int s[31000 阅读全文
摘要:
POJ_2983有了前面做的题目的基础后,这个题目也还算比较好想到的。我们设S[i]为点i到直线上某参照点的距离(可以把0看做这个参照点),为了写起来方面,干脆把题目A north thanB全部想像成B south than A,那么如果是输入P的时候,就应该有两个约束方程S[B]-S[A]>=X,S[A]-S[B]>=-X,而输入V的时候,就只对应着一个约束方程S[B]-S[A]>=1。之后如果用最短路去做的话,实际上就是判断这个图是否存在负圈。为了使图连通起来,我们抽象出一个源点0,则对任意点i都有S[i]-S[0]>=0,这样便将图连通了起来,最后只要以0为起点 阅读全文
摘要:
POJ_1716 由于有了前面几个题目的基础,解答这个题目的过程还算顺利。我们设S[i]为区间[0,i)内选取的数字的数量,那么有①S[b+1]-S[a]>=2,②S[i+1]-S[i]>=0,③S[i]-S[i+1]>=-1。这样以max(b)+1为起点,以min(a)为终点求一个最短路就可以了,最后的结果为d[max(b)+1]-d[min(a)]。#include<stdio.h>#include<string.h>int first[10010],next[30010],v[30010],w[30010];int inq[10010],q[10 阅读全文
摘要:
POJ_1364这个题目其实还算是比较简单的差分约束系统的题目。一开始其实已经把输入数据的约束条件都找全了,如果设S[i]为[a1,ai]的和,那么如果符号是gt,则有S[ai+ni]-S[ai-1]>=ki+1,如果符号是lt,则有S[ai-1]-S[ai+ni]>=-ki+1。然后发现这个图可能从S[n]开始做最短路不是连通的,于是我便想加两个辅助条件S[i]-S[i-1]>=-INF,S[i]-S[i-1]<=INF,这两个条件是没有问题的,但可能是由于INF精度的问题而WA掉了。后来再看了别人的报告之后,发现其实让图连通不用这么麻烦。首先,做最短路没必要把S[n 阅读全文
摘要:
POJ_1275对差分约束系统还是有点摸不着头脑的感觉,看了别人的分析之后才把代码写了出来。首先这个题目可以做两个预处理,一个是在输入数据时找出R[i]的最大值,最后的结果一定是大于等于R[i]的,这样在枚举结果时就可以减少一部分工作量。另一个是在输入结束后,可以枚举8个小时的区间,如果这个区间里所有可雇用的人数加起来,还不足区间尾那个时间所需要的工人数,那么这种情况一定是无解的,反之,便一定是有解的。如果设S[i]为[0,i)这些时间内雇佣的总人数,那么可以列出下面几个差分约束方程:①S[i+1]-S[i]>=0;②S[i]-S[i+1]>=-t[i];③0<=j<= 阅读全文