码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 2389 Rain on your Parade(二分图HK算法)

时间:2015-02-18 22:06:33      阅读:366      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=3003;
const int maxm=maxn*maxn;
int xlink[maxn],ylink[maxn];
int dx[maxn],dy[maxn];
int head[maxn];
int dis;
bool vis[maxn];
int n,m,t;
int ecnt;
struct Edge{
    int v,next;
    Edge(){}
    Edge(int v,int next):v(v),next(next){}
}e[maxm];
struct node{
    double x,y,v;
}p[maxn],u[maxn];
double getdis(node a,node b){
    double dx=a.x-b.x;
    double dy=a.y-b.y;
    return sqrt(dx*dx+dy*dy);
}
void add(int u,int v){
    e[ecnt]=Edge(v,head[u]);
    head[u]=ecnt++;
}
bool bfs(){
    memset(dx,-1,sizeof dx);
    memset(dy,-1,sizeof dy);
    queue<int>q;
    for(int i=0;i<n;i++){
        if(xlink[i]==-1){
            dx[i]=0;
            q.push(i);
        }
    }
    dis=inf;
    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(ylink[v]==-1)dis=dy[v];
                else{
                    dx[ylink[v]]=dy[v]+1;
                    q.push(ylink[v]);
                }
            }
        }
    }
    return dis!=inf;
}
int find(int u){
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        if(vis[v])continue;
        if(dy[v]==dx[u]+1){
            vis[v]=1;
            if(ylink[v]!=-1&&dy[v]==dis)continue;
            if(ylink[v]==-1||find(ylink[v])){
                ylink[v]=u;
                xlink[u]=v;
                return 1;
            }
        }
    }
    return 0;
}
int hk(){
    int ans=0;
    while(bfs()){
        memset(vis,0,sizeof vis);
        for(int i=0;i<n;i++)if(xlink[i]==-1){
            ans+=find(i);
        }
    }
    return ans;
}
void solve(){
    scanf("%d%d",&t,&n);
    for(int i=0;i<n;i++)scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].v);
    scanf("%d",&m);
    for(int i=0;i<m;i++)scanf("%lf%lf",&u[i].x,&u[i].y);
    memset(head,-1,sizeof head);
    memset(xlink,-1,sizeof xlink);
    memset(ylink,-1,sizeof ylink);
    ecnt=0;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++){
        double dis=getdis(p[i],u[j]);
        double d=p[i].v*t;
        if(d>=dis)add(i,j);
    }
    printf("%d\n\n",hk());
}
int main()
{
//    freopen("in","r",stdin);
    int T,cas=1;
    cin>>T;
    while(T--){
        printf("Scenario #%d:\n",cas++);
        solve();
    }
    return 0;
}

  

hdu 2389 Rain on your Parade(二分图HK算法)

标签:

原文地址:http://www.cnblogs.com/wshh/p/4295929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!