http://poj.org/problem?id=1364
http://acm.hdu.edu.cn/showproblem.php?pid=1531
差分约束 基本上就是 给你数列之间的一些大小限制
把它们 转化为点之间的限制条件 限制条件代表边
就变成最短路或最长路了 求的时候需判断有没有负环或正环
一般用 Bellmen_ford 写 还有就是效率更高一些的 SPFA
本题解释见代码注释
#include<iostream> #include<cstdio> #include<string> #include<queue> #include<stack> #include<cstring> using namespace std; const int N=105; struct node { int si,ni,k; }mem[N]; int dis[N];//前 i 项的和 int main() { int n,m; while(scanf("%d",&n)!=EOF,n) { scanf("%d",&m); int l,r,k; char a[3]; for(int i=0;i<m;++i) { scanf("%d%d%s%d",&l,&r,a,&k); if(a[0]=='g')//将其 转化为 dis[mem[i].si]+mem[i].k<=dis[mem[i].ni] 的限制条件 { mem[i].si=l-1;mem[i].ni=l+r; mem[i].k=k+1; } else //同上 { mem[i].si=l+r;mem[i].ni=l-1; mem[i].k=-k+1; } } memset(dis,0,sizeof(dis)); bool OK=false; for(int w=0;w<=n;++w)//刚开始写了个 w<n 结果wa了一下午 原来 {//由于前面的 l-1 是得点范围 变成了0--n 共n+1个点 所以循环层数要加一 OK=true; for(int i=0;i<m;++i) { if(dis[mem[i].si]+mem[i].k>dis[mem[i].ni]) { OK=false;dis[mem[i].ni]=dis[mem[i].si]+mem[i].k; } } if(OK==true) break; } if(OK==true) { printf("lamentable kingdom\n"); } else { printf("successful conspiracy\n"); } } return 0; }