您的位置:首页 > 运维架构

hdoj 2389 二分图 Hopcroft-Carp 模板

2016-08-05 22:25 323 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#define lson i<<1
#define rson (i<<1)+1
#define maxn 3005
#define maxi 233333333
#define LL long long
using namespace std;
// -------------------------模板----------------------
int link[maxn][maxn];
int dx[maxn],dy[maxn],cx[maxn],cy[maxn],used[maxn],dis;
int n,m;
bool searchP()
{
queue<int>qu;
dis = maxi;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(int i=1;i<=n;i++)
if(cx[i]==-1)
{
qu.push(i);
dx[i] = 0;
}
while(qu.size())
{
int u = qu.front();
qu.pop();
if(dx[u]>dis)break;
for(int i=1;i<=m;i++)
if(link[u][i]&&dy[i]==-1)
{
dy[i] = dx[u]+1;
if(cy[i]==-1)dis = dy[i];
else
{
dx[cy[i]] = dy[i]+1;
qu.push(cy[i]);
}
}
}
return dis!=maxi;
}
int findP(int u)
{
for(int i=1;i<=m;i++)
if(!used[i]&&link[u][i]&&dy[i]==dx[u]+1)
{
used[i] = 1;
if(cy[i]!=-1&&dis==dy[i])continue;
if(cy[i]==-1||findP(cy[i]))
{
cy[i] = u;
cx[u] = i;
return 1;
}
}
return 0;
}
int match()
{
int ans = 0;
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
while(searchP())
{
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
if(cx[i]==-1)ans+=findP(i);
}
return ans;
}
//-------------------------分界线----------------------

struct people{
int x,y,u;
}p[maxn];
struct um{
int x,y;
}u[maxn];
int T;
bool ok(people p1,um u1)
{
return (LL)T*T*p1.u*p1.u>=((LL)p1.x-u1.x)*(p1.x-u1.x)+(p1.y-u1.y)*(p1.y-u1.y);
}
int main()
{
int t,i1 = 1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&T);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].u);
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d%d",&u[i].x,&u[i].y);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
link[i][j] = ok(p[i],u[j]);
printf("Scenario #%d:\n",i1);
i1++;
printf("%d\n\n",match());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: