hdu 3440 House Man

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 320    Accepted Submission(s): 99

 

         这是本人第一次做差分约束系统的题,以前只是听说,当却不知道什么叫做差分约束系统,现在终于明白了,所谓差分约束系统就是求一组不等式的解。在看本题的约束条件,super man jump<=D    任意相邻两座房子的距离>=1,所意本体就是求满足这些不等式的从最低房子到最高房子的最远距离

代码:

  
    
1 #include < stdio.h >
2 #include < stdlib.h >
3   #define inf 2000000000
4   struct node
5 {
6 int h,num;
7 }s[ 1005 ];
8   struct bb
9 {
10 int start,end,z;
11 }bra[ 2000 ];
12   int com( const void * e1, const void * e2)
13 {
14 struct node * c = (node * )e1;
15 struct node * d = (node * )e2;
16 return c -> h - d -> h;
17 };
18 int dist[ 1005 ],n,k;
19 int relax( int u, int v, int c)
20 {
21 if (dist[u] != inf && dist[v] > dist[u] + c)
22 {
23 dist[v] = dist[u] + c;
24 return 1 ;
25 }
26 return 0 ;
27 }
28 int bellman( int v0)
29 {
30 int i,j;
31 for (i = 1 ;i <= n;i ++ )
32 {
33 dist[i] = inf;
34 }
35 dist[v0] = 0 ;
36 int flag;
37 for (i = 1 ;i < n;i ++ )
38 {
39 flag = 0 ;
40 for (j = 1 ;j <= k;j ++ )
41 {
42 if (relax(bra[j].start,bra[j].end,bra[j].z))
43 flag = 1 ;
44 }
45 if ( ! flag)
46 break ;
47 }
48 for (j = 1 ;j <= k;j ++ )
49 {
50 if (relax(bra[j].start,bra[j].end,bra[j].z))
51 return 0 ;
52 }
53 return 1 ;
54 }
55 int max( int x, int y)
56 {
57 if (x > y)
58 return x;
59 return y;
60 }
61 int min1( int x, int y)
62 {
63 if (x < y)
64 return x;
65 return y;
66 }
67 int main()
68 {
69 int t,d,i,a,end,min,max1,v0,j,count = 0 ;
70 scanf( " %d " , & t);
71 while (t -- )
72 {
73 min = inf;
74 max1 = 0 ;k = 0 ;count ++ ;
75 scanf( " %d%d " , & n, & d);
76 for (i = 1 ;i <= n;i ++ )
77 {
78 scanf( " %d " , & a);
79 s[i].num = i;
80 s[i].h = a;
81 if (a < min)
82 {
83 v0 = i;
84 min = a;
85 }
86 if (a > max1)
87 {
88 end = i;
89 max1 = a;
90 }
91 }
92 if (v0 > end)
93 {
94 int term = v0;
95 v0 = end;
96 end = term;
97 }
98 qsort(s + 1 ,n, sizeof (s[ 1 ]),com);
99 for (i = 1 ;i < n;i ++ )
100 {
101 k ++ ;
102 bra[k].start = min1(s[i].num,s[i + 1 ].num);
103 bra[k].end = max(s[i].num,s[i + 1 ].num);
104 bra[k].z = d;
105 k ++ ;
106 bra[k].start = i + 1 ;
107 bra[k].end = i;
108 bra[k].z =- 1 ;
109 }
110 if (bellman(v0))
111 printf( " Case %d: %d\n " ,count,dist[end]);
112 else
113 printf( " Case %d: %d\n " ,count, - 1 );
114 }
115 return 0 ;
116 }
117

 

 

 

你可能感兴趣的:(HDU)