观察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]}即为一组可行解。
-----------------------------------------
分别将以上参数代入题目中,即可!图论问题暂放一放,开始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;
}poj-1364 King 差分约束,布布扣,bubuko.com
原文:http://blog.csdn.net/yuzibo747/article/details/20644043