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

来源:互联网 发布:尚观java 编辑:程序博客网 时间:2024/05/16 07:42

地图上一些人,一些伞,每个人都有一个速度,问最多能有多少人能在下雨之前躲到伞里面。雨将会在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;}



0 0
原创粉丝点击