1
http://poj.org/problem?id=1364
/*
2 题意:
3 告诉你有一列长度为n的数列和m个关系式。每个关系式的表述为:
4 si ni “gt” c 或者是 si ni “lt” c。分别代表该数列第si项一直加到第si+ni项的和大于c,
5 和第si项一直加到第si+ni项的和小于c。求是否存在满足以上m个要求的数列。是则输出“lamentable kingdom”,
6 否则输出“successful conspiracy”。
7
8 tmd 犯糊涂了 用dis[i]表示 前i 项和 题中 si+s(i+1)...+s(i+n)应该=dis[i+n]-dis[i-1]
9 而我写成了 dis[i+n]-dis[i],wa......
10
11 首先题中说的是>或< 所以要 转换成为 >=或<= (差分约束处理的是>=类的问题)
12 dis[i]表示前i项和,建图,则只需判断图中是否存在正权回路
13
14
15 */
16
17 #include<stdio.h>
18 #include<queue>
19 #include<string.h>
20 #define max 0xfffffff
21 #define N 10000
22 using namespace std;
23 queue<int>q;
24 int n,m,dis[N],vis[N],time[N],num,next[N];
25 struct node
26 {
27 int next;
28 int v;
29 int w;
30 }p[N*100];
31 void insert(int u,int v,int w)
32 {
33
34 p[num].v=v;
35 p[num].w=w;
36 p[num].next=next[u];
37 next[u]=num;
38 num++;
39 }
40 void init()
41 {
42 memset(vis,0,sizeof(vis));
43 memset(time,0,sizeof(time));
44 for(int i=0;i<=n;i++)dis[i]=-max;
45 dis[n+1]=0;
46 vis[n+1]=1;
47 time[n+1]=1;
48 }
49 int SPFA()
50 {
51 init();
52 while(!q.empty())q.pop();
53 q.push(n+1);
54 while(!q.empty())
55 {
56 int u=q.front();
57 vis[u]=0;
58 q.pop();
59 for(int i=next[u];i!=-1;i=p[i].next)
60 {
61 int v=p[i].v;
62 int w=p[i].w;
63 if(dis[v]<dis[u]+w)
64 {
65 dis[v]=dis[u]+w;
66 if(!vis[v])
67 {
68 vis[v]=1;
69 q.push(v);
70 time[v]++;
71 if(time[v]>n)return -1;
72 }
73 }
74 }
75 }
76 return 1;
77
78 }
79 int main()
80 {
81 char c[5];
82 char str[50];
83 int i,x,y,w;
84 while(scanf("%d",&n),n)
85 {
86 scanf("%d",&m);
87 num=0;
88 memset(next,-1,sizeof(next));
89 getchar();
90 for(i=0;i<m;i++)
91 {
92 gets(str);
93 sscanf(str,"%d %d %s %d",&x,&y,c,&w);
94 if(strcmp(c,"gt")==0)
95 {
96 insert(x-1,x+y,w+1);
97 }
98 else insert(x+y,x-1,-w+1);
99 }
100 for(i=1;i<=n;i++)
101 {
102 insert(n+1,i,0);
103
104 }
105 int f=SPFA();
106 if(f==1)printf("lamentable kingdom\n");
107 else printf("successful conspiracy\n");
108 }
109 }