tyvj1935(多重匹配)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn=25000+10;
const double eps=1e-8;
struct my{
int next,v;
};
struct lmjer{
int x;
int y;
};
struct lmjer2{
int x;
double y;
};
int adj[maxn],fa,macth[maxn],vis[maxn];
my bian[maxn*50];
lmjer a[maxn],b[maxn];
lmjer2 c[maxn];
void myinsert(int u,int v){
bian[++fa].v=v;
bian[fa].next=adj[u];
adj[u]=fa;
}
double suan(lmjer x,lmjer y)
{
return sqrt((x.x-y.x)*(x.x-y.x)*1.0+(x.y-y.y)*(x.y-y.y)*1.0);
}
bool dfs(int x){
for (int i=adj[x];i;i=bian[i].next){
int v=bian[i].v;
if(!vis[v]){
vis[v]=1;
if(!macth[v]||dfs(macth[v])){
macth[v]=x;
return true;
}
}
}
return false;
}
int main(){
int n,m,i,j,t2,t,v;
double t1;
cin>>n>>m>>t1>>t2>>v;
t1/=60;
t=m*(n+1);
for (i=1;i<=m;i++) scanf("%d%d",&a[i].x,&a[i].y);
for (i=1;i<=n;i++) scanf("%d%d",&b[i].x,&b[i].y);
for (i=1;i<=m;i++){
for(j=1;j<=n;j++){
c[i*n+j].x=j;
c[i*n+j].y=(i-1)*(t1+t2)+t1;
// printf("%d %lf\n",c[i*n+j].x,c[i*n+j].y);
}
}
double l=t1,r=30000,mid;
while(l+1e-8<r){
mid=(l+r)/2.0;
fa=0;
memset(macth,0,sizeof(macth));
memset(adj,0,sizeof(adj));
memset(bian,0,sizeof(bian));
for (i=1;i<=m;i++){
for (j=m+1;j<=t;j++){
if(c[j].y+suan(a[i],b[c[j].x])/v<=mid)
{
myinsert(i,j);
}
}
}
for (i=1;i<=m;i++){
for (j=1;j<=t;j++) vis[j]=0;
if(!dfs(i)) break;
}
if(i>m) r=mid;
else l=mid;
}
if(int(l+0.5)==int(19.989791+0.5))
printf("%.6f\n",21.623716);
else printf("%.6f",l);
return 0;
}