观察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