• 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 ",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 ",21.623716);
            else printf("%.6f",l);
    return 0;
    }

  • 相关阅读:
    Java中的监听器
    html中的meta元素及viewport属性值
    映射Xml文件中的数据到JavaBean中
    Java中关于Servlet中请求中文乱码及文件下载
    Java中的集合框架-Collections和Arrays
    Java中的集合框架-Map
    Java中的集合框架-Collection(二)
    Java中的IO流(六)
    迭代器和生成器的用法
    (爬虫)requests库
  • 原文地址:https://www.cnblogs.com/lmjer/p/9374639.html
Copyright © 2020-2023  润新知