1548

1 /*
2 最小路径覆盖
3
4 每个垃圾是个顶点
5 */
6
7 // include file
8 #include <cstdio>
9 #include <cstdlib>
10 #include <cstring>
11 #include <cmath>
12 #include <cctype>
13 #include <ctime>
14
15 #include <iostream>
16 #include <sstream>
17 #include <fstream>
18 #include <iomanip>
19 #include <bitset>
20 #include <strstream>
21
22 #include <algorithm>
23 #include <string>
24 #include <vector>
25 #include <queue>
26 #include <set>
27 #include <list>
28 #include <functional>
29
30 using namespace std;
31
32 // typedef
33 typedef long long LL;
34 typedef unsigned long long ULL;
35
36 //
37 #define read freopen("in.txt","r",stdin)
38 #define write freopen("out.txt","w",stdout)
39 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
40 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
41 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
42 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
43
44 #define FF(i,a) for(int i=0;i<(a);i+++)
45 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
46 #define Z(a) (a<<1)
47 #define Y(a) (a>>1)
48
49 const double eps = 1e-6;
50 const double INFf = 1e10;
51 const int INFi = 1000000000;
52 const double Pi = acos(-1.0);
53
54 template<class T> inline T sqr(T a){return a*a;}
55 template<class T> inline T TMAX(T x,T y)
56 {
57 if(x>y) return x;
58 return y;
59 }
60 template<class T> inline T TMIN(T x,T y)
61 {
62 if(x<y) return x;
63 return y;
64 }
65 template<class T> inline void SWAP(T &x,T &y)
66 {
67 T t = x;
68 x = y;
69 y = t;
70 }
71 template<class T> inline T MMAX(T x,T y,T z)
72 {
73 return TMAX(TMAX(x,y),z);
74 }
75
76
77 // code begin
78 #define MAXN 625
79 vector<int> G[MAXN];
80 int mt[MAXN];
81 bool used[MAXN];
82 int N;
83 struct node
84 {
85 int r;
86 int c;
87 };
88 node ga[MAXN];
89
90 bool Isok(int i,int j)
91 {
92 // j在i右下角
93 if( ga[j].r>=ga[i].r && ga[j].c>=ga[i].c) return true;
94 return false;
95 }
96
97 bool hungarian_MM(int i)
98 {
99 FORj(0,G[i].size(),1)
100 {
101 if(!used[ G[i][j] ])
102 {
103 used[ G[i][j] ] = true;
104 if( mt[G[i][j]]==-1 || hungarian_MM(mt[G[i][j]]))
105 {
106 mt[G[i][j]] = i;
107 return true;
108 }
109 }
110 }
111 return false;
112 }
113
114 int main()
115 {
116 read;
117 write;
118 int a,b,ans;
119 while(scanf("%d %d",&a,&b)!=-1)
120 {
121 if( a+b==-2 ) break;
122 N = 0;
123 while(a+b!=0)
124 {
125 ga[N].r = a;
126 ga[N].c = b;
127 N++;
128 scanf("%d %d",&a,&b);
129 }
130 FORi(0,N,1)
131 {
132 G[i].clear();
133 FORj(i+1,N,1)
134 {
135 if( Isok(i,j))
136 G[i].push_back(j);
137 }
138 }
139
140 memset(mt,-1,sizeof(int)*MAXN);
141 ans = 0;
142 FORi(0,N,1)
143 {
144 memset(used,0,sizeof(bool)*MAXN);
145 if( hungarian_MM(i) )
146 ans++;
147 }
148 //printf("最大匹配%d\n",ans);
149 printf("%d\n",N-ans);
150 }
151 return 0;
152 }
posted @ 2011-03-05 16:14  AC2012  阅读(844)  评论(0编辑  收藏  举报