zoukankan      html  css  js  c++  java
  • 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
    ",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:
    ",num);
    131         binary_match();
    132         puts("");
    133     }
    134     return 0;
    135 }
  • 相关阅读:
    C# 递归查找树状目录
    C#递归计算树形菜单
    使用StringBuilder写XML遭遇UTF-16问题
    Error: 'The service did not respond in a timely fashion'
    no suitable method found to override
    Could not load file or assembly "win32_x86dotnet1crdb_adoplus.dll' or one of its dependencies.
    Unable to find the requested .Net Framework Data Provider
    Call JMS Web Service
    Remove Mapping
    卸载windows服务
  • 原文地址:https://www.cnblogs.com/der-z/p/3703306.html
Copyright © 2011-2022 走看看