vijos1212 Way Selection(二分图最大匹配)

来源:互联网 发布:锐捷 mac过滤 编辑:程序博客网 时间:2024/05/20 05:22

建二分图,然后去跑匈牙利算法就好了。

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 1010inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,t,bf[N],ans=0,h[N],num=0;bool f[N];struct point{    double x,y;}p[N];struct edge{    int to,next;}data[N*N];bool find(int x){    for(int i=h[x];i;i=data[i].next){        int y=data[i].to;if(f[y]) continue;        f[y]=1;if(!bf[y]||find(bf[y])){bf[y]=x;return 1;}    }}int main(){//  freopen("a.in","r",stdin);    while(~scanf("%d%d%d",&n,&m,&t)){        num=0;memset(h,0,sizeof(h));        for(int i=1;i<=m;++i) scanf("%lf%lf",&p[i].x,&p[i].y);        for(int i=1;i<=n;++i){            double x,y,v;scanf("%lf%lf%lf",&x,&y,&v);            for(int j=1;j<=m;++j){                if((x-p[j].x)*(x-p[j].x)+(y-p[j].y)*(y-p[j].y)>v*t*v*t) continue;                data[++num].to=j;data[num].next=h[i];h[i]=num;            }        }        for(int i=1;i<=n;++i){            memset(f,0,sizeof(f));            if(find(i)) ans++;        }        printf("%d\n",ans);    }    return 0;}
原创粉丝点击