pku 1364

题目连接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1364

     已知一个序列a[1], a[2], ......, a[n],给出它的若干子序列以及对该子序列的约束条件,例如a[si], a[si+1], a[si+2], ......, a[si+ni],且a[si]+a[si+1]+a[si+2]+......+a[si+ni] < or > ki,问这样的序列a存不存在。输入:n, m,之后是输入m个约束条件:si, ni, op, ki, op为>或<。显然这可以转化为差分约束系统:令sigma(i) = a[1]+a[2]+......+a[n],则a[si]+a[si+1]+a[si+2]+......+a[si+ni] < ki可以变为sigma(si+ni) - sigma(si-1) < ki <= ki - 1;a[si]+a[si+1]+a[si+2]+......+a[si+ni] > ki可以变为sigma(si-1) - sigma(si+ni) < -ki <= -ki-1;由于这里输入的都是整数,所以我们可以把>(<)转换成>=(<=),然而就可以转换成差分约束系统解决。
对于第一个样例:

代码:

#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int MAX=150; const int inf=99999999; struct node { int s,e,v;//边的起点和终点,v是边权值 }; node map[MAX]; int dis[MAX]; int n,m,num; bool Bellman_ford() { memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(dis[map[j].s]+map[j].v<dis[map[j].e]) dis[map[j].e]=dis[map[j].s]+map[j].v; } } for(int j=1;j<=m;j++) { if(dis[map[j].s]+map[j].v<dis[map[j].e]) return false; } return true; } int main() { while(scanf("%d",&n)&&n) { scanf("%d",&m); int s,e,v; num=0; char str[5]; for(int i=1;i<=m;i++) { scanf("%d %d %s %d",&s,&e,&str,&v); if(str[0]=='g') { map[i].s=s+e; map[i].e=s-1; map[i].v=-v-1; } else if(str[0]=='l') { map[i].s=s-1; map[i].e=s+e; map[i].v=v-1; } } if(Bellman_ford()) printf("lamentable kingdom/n"); else printf("successful conspiracy/n"); } return 0; }

 

你可能感兴趣的:(pku 1364)