zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    javascript常用对象
    oracle储存过程,job,视图,触发器(记性不好,写个例子自己记)
    xml直接读取节点
    脑瓜子的文章导航 脑瓜子的学院系列文章汇总
    ASP.NET MVC 中实现View与Controller分离
    开发
    SQLite学习手册(转)
    缓存数据库redis、memcached。 MongoDB 资源集锦
    在GOOGLE浏览器中模拟移动浏览器 调试Web app
    Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略
  • 原文地址:https://www.cnblogs.com/lmjer/p/9374639.html
Copyright © 2011-2022 走看看