题意:
给出多组关系,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 }