您的位置:首页 > 其它

ZOJ 3156 Taxi 二分图+二分查找

2013-03-13 23:04 375 查看
题意:街道上有人和出租车,输入人和车的位置,然后计算所有人都上车的最短时间,每个人同时上车

做法:匈牙利算法直接...

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: