uva 515(差分约束)

题意:告诉你数列中的一段数满足大于或小于不等式关系,让你求是不是存在这样一个数列。

思路:典型的差分约束的题。主要的步骤是这样的先建图后用SPFA算法判断存不存在负环。

SPFA算法的具体实现见我的《最短路算法总结》。下面讲一下如何建图首先需要找到一个小于等于的不等式a-b<=c再由b向a连一条权值为c的边。

至于如何变成这样的不等式只要简单的不等式变换就行了。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <utility>
10 #define LEN 1010
11 #define INF 0x3f3f3f3f
12 #define mp(a, b) make_pair(a, b)
13 #define pb(a) push_back(a)
14 
15 using namespace std;
16 typedef pair<int, int> pii;
17 
18 int n, m, dis[LEN];
19 vector<pii> Map[LEN];
20 
21 void debug(int x[]){
22     for(int i=0; i<=n; i++){
23         cout << x[i] << ' ';
24     }cout << endl;
25 }
26 
27 bool SPFA(int s){
28     int vis[LEN] = {0}, cnt[LEN] = {0};
29     queue<int> q;
30     memset(dis, 0x3f, sizeof dis);
31     dis[s] = 0;
32     q.push(s);
33     vis[s] = 1;
34     cnt[s]++;
35     while(!q.empty())
36     {
37         int nv = q.front();q.pop();
38         vis[nv] = 0;
39         for(int i=0; i<Map[nv].size(); i++){
40             int x = Map[nv][i].first, y = Map[nv][i].second;
41             if(dis[x] > dis[nv]+y){
42                 dis[x] = dis[nv]+y;
43                 if(!vis[x]){
44                     vis[x] = 1;
45                     cnt[x]++;
46                     if(cnt[x]>n+1) return false;
47                     q.push(x);
48                 }
49             }
50         }
51     }
52     return true;
53 }
54 
55 int main()
56 {
57 //    freopen("in.txt", "r", stdin);
58 
59     int a, b, c;
60     char op[10];
61     while(scanf("%d", &n)!=EOF && n){
62         scanf("%d", &m);
63         for(int i=0; i<=LEN; i++)Map[i].clear();
64         for(int i=0; i<m; i++){
65             scanf("%d%d%s%d", &a, &b, op, &c);
66             if(strcmp(op, "gt")==0){
67                 Map[a+b].pb(mp(a-1, -c-1));
68             }else{
69                 Map[a-1].pb(mp(a+b, c-1));
70             }
71         }
72         for(int i=0; i<=n; i++){
73             Map[n+1].pb(mp(i,1));
74         }
75 
76         if(SPFA(n+1)==true)cout << "lamentable kingdom" << endl;
77         else cout << "successful conspiracy" << endl;
78     }
79     return 0;
80 }
View Code

 

posted @ 2013-12-29 19:59  张小豪  阅读(228)  评论(0编辑  收藏  举报