zoukankan      html  css  js  c++  java
  • 【洛谷 4047】部落划分

    题目背景

    BB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。

    题目描述

    给出BB地区的村庄数NN,村庄编号从00到N-1N1,和所有MM条公路的长度,公路是双向的。并给出第ii个村庄重建完成的时间t_iti,你可以认为是同时开始重建并在第t_iti天重建完成,并且在当天即可通车。若t_iti00则说明地震未对此地区造成损坏,一开始就可以通车。之后有QQ个询问(x, y, t)(x,y,t),对于每个询问你要回答在第tt天,从村庄xx到村庄y的最短路径长度为多少。如果无法找到从xx村庄到yy村庄的路径,经过若干个已重建完成的村庄,或者村庄xx或村庄yy在第t天仍未重建完成 ,则需要返回-11。

    输入格式

    第一行包含两个正整数N,MN,M,表示了村庄的数目与公路的数量。

    第二行包含NN个非负整数t_0, t_1,…, t_{N-1}t0,t1,,tN1,表示了每个村庄重建完成的时间,数据保证了t_0 ≤ t_1 ≤ … ≤ t_{N-1}t0t1tN1

    接下来MM行,每行33个非负整数i, j, wi,j,w,ww为不超过1000010000的正整数,表示了有一条连接村庄ii与村庄jj的道路,长度为ww,保证i≠jij,且对于任意一对村庄只会存在一条道路。

    接下来一行也就是M+3M+3行包含一个正整数QQ,表示QQ个询问。

    接下来QQ行,每行33个非负整数x, y, tx,y,t,询问在第tt天,从村庄xx到村庄yy的最短路径长度为多少,数据保证了tt是不下降的。

    输出格式

    QQ行,对每一个询问(x, y, t)(x,y,t)输出对应的答案,即在第tt天,从村庄xx到村庄yy的最短路径长度为多少。如果在第t天无法找到从xx村庄到yy村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄yy在第tt天仍未修复完成,则输出-11。

    输入输出样例

    输入 #1
    4 5
    1 2 3 4
    0 2 1
    2 3 1
    3 1 2
    2 1 4
    0 3 5
    4
    2 0 2
    0 1 2
    0 1 3
    0 1 4
    输出 #1
    -1
    -1
    5
    4

    说明/提示

    对于30\%30%的数据,有N≤50N50;

    对于30\%30%的数据,有t_i= 0ti=0,其中有20\%20%的数据有t_i = 0ti=0且N>50N>50;

    对于50\%50%的数据,有Q≤100Q100;

    对于100\%100%的数据,有N≤200N200,M≤N imes (N-1)/2MN×(N1)/2,Q≤50000Q50000,所有输入数据涉及整数均不超过100000100000。

     
    题解:不断合并最小的边,这样就最近的就会变大     
     
    // luogu-judger-enable-o2
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    typedef double db;
    const int N=1005;
    
    struct node{
        int u,v;
        db w;
    }e[1002019];
    int n,m,x[N],y[N],cp,fa[N];
    db a[N];
    int find(int x){
        if(x!=fa[x]) 
           fa[x]=find(fa[x]);
        return fa[x];
    } 
    
    db how_long(int uu,int vv){
        int x5=x[uu]; int x6=x[vv];
        int y5=y[uu]; int y6=y[vv];
        return (db)(sqrt((db)(x5-x6)*(db)(x5-x6)+(db)(y5-y6)*(db)(y5-y6)));
    }
    void add_YCLL(int aa,int bb){
        cp++; e[cp].u=aa; e[cp].v=bb;
        e[cp].w=how_long(aa,bb);
    }
    bool cmp(node aa,node bb)
        { return aa.w<bb.w; }
    int main(){
     
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d %d",&x[i],&y[i]);
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                add_YCLL(i,j);
        sort(e+1,e+cp+1,cmp);
        db ans=0.0; 
        int tot=0;
        for(int i=1;i<=cp;i++){
            int u=find(e[i].u);
            int v=find(e[i].v);
            if(u==v) continue;
            ans=e[i].w; 
            fa[u]=v; tot++;
            a[tot]=e[i].w;
            if(tot==(n-m+1)){
                printf("%.2lf",e[i].w);
                break;
            } 
        } 
        //printf("%.2lf",a[n-m+1]);
        return 0;
    }
  • 相关阅读:
    爬取70城房价到oracle数据库并6合1
    oracle自定义存储过程:删除表(无论表是否存在)和检测表是否存在
    Oracle 11g 手工建库
    RHEL7.5 静默安装(silent mode)oracle11gr2数据库软件
    连载《一个程序猿的生命周期》-《发展篇》- 22.城市奋斗者的阿Q精神
    连载《一个程序猿的生命周期》-《发展篇》- 21.“中兴事件”反应出的价值偏差
    连载《一个程序猿的生命周期》-《发展篇》- 20.与一位博士生聊天,终归还是要面对现实
    连载《一个程序猿的生命周期》-《发展篇》- 17.程序猿们,收起玻璃心,给你们的忠告
    连载《一个程序猿的生命周期》-《发展篇》- 16.最近两件事触动了我,30多岁真是死都不能死的年纪
    连载《一个程序猿的生命周期》-《发展篇》- 14.天要下雨,娘要嫁人,由他去吧。
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11303116.html
Copyright © 2011-2022 走看看