题意:街道上有人和出租车,输入人和车的位置,然后计算所有人都上车的最短时间,每个人同时上车
做法:匈牙利算法直接...
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int LMT=102;
double gra[LMT][LMT],chose[LMT*LMT],x[LMT<<1],y[LMT<<1],have;
int xnum,ynum,cnt,link[LMT];
bool vis[LMT];
bool dfs(int i)
{
for(int j=0;j<ynum;j++)
{
if(gra[i][j]<=have&&!vis[ j ])
{
vis[ j ]=true;
if(link[ j ]==-1||dfs(link[ j ]))
{
link[ j ]=i;
return true;
}
}
}
return false;
}
bool hu(void)
{
memset(link,-1,sizeof(link));
for(int i=0;i<xnum;i++)
{
memset(vis,0,sizeof(vis));
if(!dfs(i))return 0;
}
return 1;
}
double solve(void)
{
int l=0,r=cnt-1,m;
double res=0;
while(l<=r)
{
int m=(l+r)>>1;
have=chose[m];
if(hu())
{
res=have;
r=m-1;
}
else l=m+1;
}
return res;
}
int main()
{
double v;
int i;
while(~scanf("%d%d",&xnum,&ynum))
{
int i;
cnt=0;
memset(gra,-1,sizeof(gra));
for(i=0;i<xnum;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(;i<xnum+ynum;i++)
scanf("%lf%lf",&x[i],&y[i]);
scanf("%lf",&v);
for(int i=0;i<xnum;i++)
for(int j=0;j<ynum;j++)
{
gra[i][j]=sqrt((x[i]-x[j+xnum])*(x[i]-x[j+xnum])+(y[i]-y[j+xnum])*(y[i]-y[j+xnum]))/v;
chose[cnt++]=gra[i][j];
}
sort(chose,chose+cnt);
printf("%.2lf\n",solve());
}
return 0;
}