2 1 2 1 0 3 3 0 3 2 4 0 6 0 1 2 1 1 2 3 3 2 2 2 2 4 4
Scenario #1: 2 Scenario #2: 2
#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;
const int N = 3005;
const int INF=1<<28;
int head[N],to[N*N],next1[N*N],tot; //存图
int dx[N],dy[N],dis; //左边部分距离,右边部分距离,记录右边部分没有被匹配过的点的最大距离
int machx[N],nx,machy[N]; //左边部分点匹配右边点,左边部分的点个数,右边部分点匹配左边的点
bool vist[N];
void addEdg(int u,int v){
to[tot]=v; next1[tot]=head[u]; head[u]=tot++;
}
bool searchpath(){//找有没有增广路
queue<int>q;
dis=INF;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(int i=1; i<=nx; i++)
if(machx[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=next1[i]){
int v=to[i];
if(dy[v]==-1){
dy[v]=dx[u]+1;
if(machy[v]==-1)
dis=dy[v];
else{
dx[machy[v]]=dy[v]+1;
q.push(machy[v]);
}
}
}
}
return dis!=INF;
}
bool findroad(int u){
for(int i=head[u]; i!=-1; i=next1[i]){
int v=to[i];
if(!vist[v]&&dy[v]==dx[u]+1){
vist[v]=1;
if(machy[v]!=-1&&dy[v]==dis)
continue;
if(machy[v]==-1||findroad(machy[v])){
machy[v]=u; machx[u]=v; return true;
}
}
}
return false;
}
int MaxMatch(){
int ans=0;
memset(machx,-1,sizeof(machx));
memset(machy,-1,sizeof(machy));
while( searchpath() ){
memset(vist,0,sizeof(vist));
for(int i=1; i<=nx; i++)
if(machx[i]==-1)
ans+=findroad(i);
}
return ans;
}
//-------------上面部分的代码为模板---------------------
struct node{
int x,y;
double dis;
}man[N],umb[N];
double countDis(int u,int v){
return sqrt((man[u].x-umb[v].x)*(man[u].x-umb[v].x)*1.0+(man[u].y-umb[v].y)*(man[u].y-umb[v].y)*1.0);
}
int main(){
int T,ny,tim,c=0;
scanf("%d",&T);
while(T--){
scanf("%d%d",&tim,&nx);
for(int i=1;i<=nx;i++){
scanf("%d%d%lf",&man[i].x,&man[i].y,&man[i].dis);
man[i].dis*=tim;
}
scanf("%d",&ny);
for(int i=1;i<=ny;i++)
scanf("%d%d",&umb[i].x,&umb[i].y);
//---------------------建图---------------------
tot=0;
memset(head,-1,sizeof(head));
for(int u=1;u<=nx;u++)
for(int v=1;v<=ny;v++)
if(man[u].dis>=countDis(u,v))
addEdg(u,v);
//----------------------------------------------
int ans=MaxMatch();
printf("Scenario #%d:\n%d\n\n",++c,ans);
}
return 0;
}
HDU 2389 Rain on your Parade (二分图匹配(Hopcroft-Carp的算法模板))
原文:http://blog.csdn.net/u010372095/article/details/45772801