PKU 1364 King 差分约束

题意:

  给出多组关系,a1+a2+a3...... > k 或者 < ,然后问你给出的这些关系有没有互相矛盾的,

给出的这些数字都是未知的,只知道关系。

 

坑爹:

  算是第一次做这样的题吧。看了下差分约束才知道可以将这些关系关系转换为图论。所以我感觉

建图比较难想到,不过想到了这道题也就比较简单了。

 

解法:

  因为题目中给的都是加法,但又因为是连续的,所以可以变成前N项和做减法,a2+a3+a4就变成了

S4 - S1了,再把所有的大于小于号都变成小于等于号,变等于只需要-1就行了(因为都是整数)。

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxn = 100 + 5;
 5 const int INF = 0xfffffff;
 6 
 7 struct EDGE{
 8     int x;
 9     int y;
10     int l;
11 }Edge[105];
12 int m;
13 int n;
14 int d[maxn];
15 
16 
17 void AddEdge(int x,int y,char sym[],int ans,int i)
18 {
19     if(sym[0] == '>')
20     {
21         Edge[i].x = x - 1;
22         Edge[i].y = x + y;
23         Edge[i].l = ans * (-1) - 1;
24     }
25     else
26     {
27         Edge[i].x = x + y;
28         Edge[i].y = x - 1;
29         Edge[i].l = ans - 1;
30     }
31 }
32 
33 bool negativeCycle()
34 {
35     int i;
36     int j;
37     for(i=0; i<=n; i++)
38     {
39         d[i] = INF;
40     }
41     d[1] = 0;
42     for(i=0; i<=n; i++)
43     {
44         for(j=1; j<=m; j++)
45         {
46             if(d[Edge[j].y] > d[Edge[j].x] + Edge[j].l)
47             {
48                 d[Edge[j].y] = d[Edge[j].x] + Edge[j].l;
49             }
50         }
51     }
52     for(j=1; j<=m; j++)
53     {
54         if(d[Edge[j].y] > d[Edge[j].x] + Edge[j].l)
55         {
56             d[Edge[j].y] = d[Edge[j].x] + Edge[j].l;
57             return false;
58         }
59     }
60     return true;
61 }
62 
63 int main()
64 {
65     freopen("pc.txt","r",stdin);
66     freopen("out.txt","w",stdout);
67     while(cin>>n,n)
68     {
69         cin>>m;
70         int i;
71         int x;
72         int y;
73         char sym[10];
74         int ans;
75         for(i=1; i<=m; i++)
76         {
77             cin>>x>>y>>sym>>ans;
78             AddEdge(x,y,sym,ans,i);
79         }
80 
81         if (negativeCycle()) 
82         {
83             printf("pc so clear!\n");  
84         }
85         else 
86         {
87             printf("meiyu is a bad egg!\n");
88         }
89     }
90     return 0;
91 }
View Code

 

转载于:https://www.cnblogs.com/pcpcpc/p/3287507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值