poj1364
差分约束
1.自己先跳过bellman-ford的SPFA改进算法与Flord(所有点之间的最短距离),开始进入了差分约束系统的一个练习.
如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。
(1)每个不等式中的每种未知数Xi对应图中的一个顶点Vi
(2)把所有不等式都转化成图中的一条边,一定转成小于等于的形式,其间有数学的技巧,我们一会分析这个题的样例, 转换成Xi<=Xj+c,即转换成边<Vi,Vj>,权值为c
poj 1364是说(英语理解能力真心给跪了)一个有序整数列组有没有解(对吧?)
首行 4 2,是4个有序整数列,2个不等式组;1 2 gt 0;
是说从a1开始,一直加和两个,即a1+a2+a3>0;那么2 2 lt 2:=> a2+a3+a4<2;
我们要将这两个不等式组化为符合以上形式的不等式组:S3-S0>0和S4-S1<2;为了加上等号,我们在两式的右侧-1,同时变号,有S0-S3<=-1;S4-S1<=1;
那么根据"gt,lt"的不同,通式可以表示为
a b gt c
S[a-1]-s[a+b]<=-c-1
a b lt c
S[a+b]-S[a-1]<=c-1,
差分约束
1.自己先跳过bellman-ford的SPFA改进算法与Flord(所有点之间的最短距离),开始进入了差分约束系统的一个练习.
如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。
观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]。因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk。我们再增加一个源点s,s与所有定点相连,边权均为0。对这个图,以s为源点运行Bellman-ford算法(或SPFA算法),最终{d[ i]}即为一组可行解。
-----------------------------------------
(1)每个不等式中的每种未知数Xi对应图中的一个顶点Vi
(2)把所有不等式都转化成图中的一条边,一定转成小于等于的形式,其间有数学的技巧,我们一会分析这个题的样例, 转换成Xi<=Xj+c,即转换成边<Vi,Vj>,权值为c
poj 1364是说(英语理解能力真心给跪了)一个有序整数列组有没有解(对吧?)
首行 4 2,是4个有序整数列,2个不等式组;1 2 gt 0;
是说从a1开始,一直加和两个,即a1+a2+a3>0;那么2 2 lt 2:=> a2+a3+a4<2;
我们要将这两个不等式组化为符合以上形式的不等式组:S3-S0>0和S4-S1<2;为了加上等号,我们在两式的右侧-1,同时变号,有S0-S3<=-1;S4-S1<=1;
那么根据"gt,lt"的不同,通式可以表示为
a b gt c
S[a-1]-s[a+b]<=-c-1
a b lt c
S[a+b]-S[a-1]<=c-1,
分别将以上参数代入题目中,即可!图论问题暂放一放,开始DAG.
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define MAXE 110
#define MAXV 110
typedef struct
{
int u,v,w;//边的两点及权值
}Edge;
Edge edge[MAXE];
int n,m,d[MAXV];//Var,m 边数
int Bellmanford()
{
int i,j;
memset(d,0,sizeof(d));
for(i=1;i<=n;i++)//也是一个关键点
{
for(j=0;j<m;j++)
if(d[edge[j].u]+edge[j].w<d[edge[j].v])
{
d[edge[j].v]=d[edge[j].u]+edge[j].w;
}
}
for(j=0;j<m;j++)
{
if(d[edge[j].u]+edge[j].w<d[edge[j].v])
return 0;
}
return 1;
}
int main()
{
// freopen("king.in","r",stdin);
int i,a,b,c;
char s[5];
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d%s%d",&a,&b,s,&c);
if(s[0]=='g')
{
edge[i].u=b+a;
edge[i].v=a-1;
edge[i].w=-c-1;
}
else
{
edge[i].u=a-1;
edge[i].v=b+a;
edge[i].w=c-1;
}
}
if(Bellmanford())
printf("lamentable kingdom\n");
else
printf("successful conspiracy\n");
}
return 0;
}