HDU 2389 Rain on your Parade

http://acm.hdu.edu.cn/showproblem.php?pid=2389

题意:给暴风雨到来的时刻,m个人的坐标和单位速度,和n个救生衣的坐标。每个救生衣只能匹配一个人,求最多有多少人可以得到救生衣。

题解:典型二分图最大匹配题型。因为点比较多,使用Hopcroft-Karp算法。讲解:http://blog.csdn.net/wall_f/article/details/8248373

        http://www.cnblogs.com/-sunshine/archive/2012/08/30/2664242.html

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cmath>
  6 #include <string>
  7 #include <vector>
  8 #include <list>
  9 #include <map>
 10 #include <queue>
 11 #include <stack>
 12 #include <bitset>
 13 #include <algorithm>
 14 #include <numeric>
 15 #include <functional>
 16 #include <set>
 17 #include <fstream>
 18 
 19 using namespace std;
 20 const int maxn=3010;
 21 const int INF=1<<28;
 22 bool used[maxn];
 23 struct guest{
 24     int x;
 25     int y;
 26     int speed;
 27 }gu[maxn];
 28 struct umbrellas{
 29     int x;
 30     int y;
 31 }um[maxn];
 32 int mymap[maxn][maxn];
 33 int dis;
 34 int cx[maxn],cy[maxn],dx[maxn],dy[maxn];
 35 int V;
 36 int ca,t,m,n;
 37 
 38 bool searchpath()
 39 {
 40     queue<int> Q;
 41     dis=INF;
 42     memset(dx, -1, sizeof(dx));
 43     memset(dy, -1, sizeof(dy));
 44     for (int i=0; i<V; i++) {
 45         if (cx[i]==-1) {
 46             Q.push(i);
 47             dx[i]=0;
 48         }
 49     }
 50     while (!Q.empty()) {
 51         int u=Q.front();
 52         Q.pop();
 53         if (dx[u]>dis) {
 54             break;
 55         }
 56         for (int v=0; v<V; v++) {
 57             if (mymap[u][v]&&dy[v]==-1) {
 58                 dy[v]=dx[u]+1;
 59                 if (cy[v]==-1) {
 60                     dis=dy[v];
 61                 }
 62                 else {
 63                     dx[cy[v]]=dy[v]+1;
 64                     Q.push(cy[v]);
 65                 }
 66             }
 67         }
 68     }
 69     return dis!=INF;
 70 }
 71 
 72 int findpath(int u)
 73 {
 74     for (int v=0; v<n; v++) {
 75         if (!used[v]&&mymap[u][v]&&dy[v]==dx[u]+1) {
 76             used[v]=1;
 77             if (cy[v]!=-1&&dy[v]==dis) {
 78                 continue;
 79             }
 80             if (cy[v]==-1||findpath(cy[v])) {
 81                 cy[v]=u;
 82                 cx[u]=v;
 83                 return 1;
 84             }
 85         }
 86     }
 87     return 0;
 88 }
 89 
 90 void binary_match()
 91 {
 92     int res=0;
 93     memset(cx, -1, sizeof(cx));
 94     memset(cy, -1, sizeof(cy));
 95     while (searchpath()) {
 96         memset(used,0,sizeof(used));
 97         for (int i=0; i<V; i++) {
 98             if (cx[i]==-1) {
 99                 res+=findpath(i);
100             }
101         }
102     }
103     printf("%d\n",res);
104 }
105 int main()
106 {
107     //freopen("/Users/apple/Desktop/hdu 2389/hdu 2389/in", "r", stdin);
108     //freopen("/Users/apple/Desktop/hdu 2389/hdu 2389/out", "w", stdout);
109 
110     scanf("%d",&ca);
111     for (int num=1; num<=ca; num++) {
112         scanf("%d",&t);
113         scanf("%d",&m);
114         for (int i=0; i<m; i++) {
115             scanf("%d%d%d",&gu[i].x,&gu[i].y,&gu[i].speed);
116         }
117         scanf("%d",&n);
118         for (int i=0; i<n; i++) {
119             scanf("%d%d",&um[i].x,&um[i].y);
120         }
121         memset(mymap, 0, sizeof(mymap));
122         V=m;
123         for (int i=0; i<m; i++) {
124             for (int j=0; j<n; j++) {
125                 if (pow(gu[i].x-um[j].x,2)+pow(gu[i].y-um[j].y,2)<=t*t*gu[i].speed*gu[i].speed) {
126                     mymap[i][j]=1;
127                 }
128             }
129         }
130         printf("Scenario #%d:\n",num);
131         binary_match();
132         puts("");
133     }
134     return 0;
135 }

 

posted @ 2014-05-01 21:13  Der_Z  阅读(220)  评论(0编辑  收藏  举报