题目链接:http://poj.org/problem?id=1364
题意:给出n个变量,m个约束公式 asi + asi+1 + .... + asi+ni < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。
分析:asi + asi+1 + ....... + asi + n < ki or > ki,因为ai和ki都为整,设sum[n] 为 变量ai的前n个和,则可以转化为 sum[si+n] - sum[si-1] <= ki -1 or sum[si-1] - sum[si+n] <= -1-ki ,这样问题就转化为差分约束的情况,可以差用Bellman-Ford算法进行求解。
代码:
#include<stdio.h>
#include<string.h>
struct Edge
{
int u;
int v;
int w;
}edge[105];
int dis[105];
int n,m,p;
int si,ni,ki;
char oi[3];
int Bellman_ford()
{
int i,j;
memset(dis,0,sizeof(dis));
for(i=1;i<=n;i++)//引入源点0之后有n+1个点了,最多松弛n次
for(j=0;j<p;j++)
if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
dis[edge[j].v] = dis[edge[j].u]+edge[j].w;
for(i=0;i<p;i++)//如果第n+1还可以松弛,则说明存在负权环,即不存在这样的序列
if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w)
return 1;
return 0;
}
int main()
{
int i;
while(scanf("%d",&n) && n!=0)
{
p=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d%s%d",&si,&ni,oi,&ki);
if(oi[0]-'l' == 0)
{
edge[p].u=si-1;
edge[p].v=si+ni;
edge[p].w=ki-1;
p++;
}
else
{
edge[p].u=si+ni;
edge[p].v=si-1;
edge[p].w=-ki-1;
p++;
}
}
if(Bellman_ford())
printf("successful conspiracy\n");
else
printf("lamentable kingdom\n");
}
return 0;
}