您的位置:首页 > 大数据 > 人工智能

hdu 2389 Rain on your Parade (二分图,Hopcroft-Karp)

2015-04-06 12:30 369 查看
地图上一些人,一些伞,每个人都有一个速度,问最多能有多少人能在下雨之前躲到伞里面。雨将会在t分钟后来临。

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
void cmax(int& a,int b){ if(b>a)a=b; }
void cmin(int& a,int b){ if(b<a)a=b; }
void cmax(ll& a,ll b){ if(b>a)a=b; }
void cmin(ll& a,ll b){ if(b<a)a=b; }
void add(int& a,int b,int mod){ a=(a+b)%mod; }
void add(ll& a,ll b,ll mod){ a=(a+b)%mod; }
const int oo=0x3f3f3f3f;
const int MOD=1000000007;
const int maxn=6666;
const int maxm=44435556;
int vis[maxn];
int x[maxn],y[maxn];
int dx[maxn],dy[maxn];
int dis,n;
struct EDGE{
    int v,next;
}E[maxm];
int head[maxn],tol;
struct Node{
    int x,y,sp;
}a[maxn],b[maxn];

void Init(){
    memset(head,-1,sizeof head);
    tol=0;
}

void add_edge(int u,int v){
    E[tol].v=v;
    E[tol].next=head[u];
    head[u]=tol++;
}

bool bfs(){
    memset(dx,-1,sizeof dx);
    memset(dy,-1,sizeof dy);
    dis=oo;
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(x[i]==-1){
            q.push(i);
            dx[i]=0;
        }
    }
    while(!q.empty()){
        int u=q.front();q.pop();
        if(dx[u]>dis)break;
        for(int i=head[u];i!=-1;i=E[i].next){
            int v=E[i].v;
            if(dy[v]==-1){
                dy[v]=dx[u]+1;
                if(y[v]==-1)dis=dy[v];
                else{
                    dx[y[v]]=dy[v]+1;
                    q.push(y[v]);
                }
            }
        }
    }
    return dis!=oo;
}

int dfs(int u){
    for(int i=head[u];i!=-1;i=E[i].next){
        int v=E[i].v;
        if(!vis[v]&&dy[v]==dx[u]+1){
            vis[v]=1;
            if(y[v]!=-1&&dy[v]==dis)continue;
            if(y[v]==-1||dfs(y[v])){
                x[u]=v;
                y[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int Match(){
    memset(x,-1,sizeof x);
    memset(y,-1,sizeof y);
    int ans=0;
    while(bfs()){
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++)if(x[i]==-1){
            ans+=dfs(i);
        }
    }
    return ans;
}

int main(){
    //freopen("E:\\read.txt","r",stdin);
    int u,v,t,N,M,T;
    scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){
        Init();
        scanf("%d",&t);
        scanf("%d",&N);
        for(int i=1;i<=N;i++){
            scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].sp);
        }
        scanf("%d",&M);
        for(int i=1;i<=M;i++){
            scanf("%d %d",&b[i].x,&b[i].y);
        }
        n=N+M;
        for(int i=1;i<=N;i++){
            for(int j=1;j<=M;j++){
                if(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y)<=a[i].sp*t)
                    add_edge(i,j+N);
            }
        }
        printf("Scenario #%d:\n%d\n\n",cas,Match());
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: