• cogs 29. 公路建设


    29. 公路建设

    ★   输入文件:road.in   输出文件:road.out   简单对比
    时间限制:1 s   内存限制:128 MB

    【问题描述】

        A 国是一个新兴的国家,有 N 个城市,分别编号为 1,2.3…N 。政府想大搞公路建设,提供了优惠政策:对于每一个投资方案的预计总费用,政府负担 50% ,并且允许投资的公司对过往的汽车收取连续 5 年的养路费。世界各地的大公司纷纷投资,并提出了自己的建设方案,他们的投资方案包括这些内容:公路连接的两座城市的编号,预计的总费用(假设他们的预计总是准确的)。

        你作为 A 国公路规划局的总工程师,有权利决定每一个方案是否接受。但是政府给你的要求是:

    ( 1 )要保证各个城市之间都有公路直接或间接相连。

    ( 2 )因为是新兴国家,政府的经济实力还不强。政府希望负担最少的费用。

        因为大公司并不是同时提出方案,政府希望每接到一个方案,就可以知道当前需要负担的最小费用和接受的投资方案,以便随时开工。关于你给投资公司的回复可以等到开工以后再给。 注意: A 国一开始是没有公路的。我们设定 A 国的城市数目 N<=500 ,投资的方案总数 M<=2000 。

     

    【输入格式】

    输入文件名: road.in

    第 1 行有两个数字: N 、 M

    第 2 行到第 M+1 行给出了各个投资方案,第 i 行的方案编号为 i-1

    编号小的方案先接到,一个方案占一行,每行有 3 个数字,分别是连接的两个城市编号 a 、 b ,和投资的预计总费用 cost 。

    【输出格式】

    输出文件名: road.out

    输出文件共有 M 行。

    每一行的第一个数字是当前政府需要负担的最少费用(保留 1 位小数),后面是 X 个数字,表示当前政府接受的方案的编号, 不 要求从小到大排列。但如果此时接受的所有投资方案不能保证政府的第一条要求,那么这一行只有一个数字 0

    【输入样例】

    输入文件名: road.in

    3 5
    1 2 4
    1 3 4
    2 3 4
    1 3 2
    1 2 2

    输出文件名: road.out

    0
    4.0 1 2 
    4.0 1 2 
    3.0 1 4 
    2.0 4 5
     

    注意:由于没有评测插件,不要求输出方案。

    即样例输出:

    0
    4.0
    4.0
    3.0
    2.0

    思路:首先你要读懂题意,然后跑m遍最小生成树。

    错因:数组开小了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,tot,num,ans,fa[50000];
    struct nond{
        int x,y,z;
    }edge[50000];
    int cmp(nond a,nond b){
        return a.z<b.z;
    }
    int find(int x){
        if(fa[x]==x)    return fa[x];
        else return fa[x]=find(fa[x]);
    }
    int main(){
        freopen("road.in","r",stdin);
        freopen("road.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            edge[++tot].x=x;
            edge[tot].y=y;
            edge[tot].z=z;
            num=0;ans=0;
            sort(edge+1,edge+1+tot,cmp);
            for(int i=1;i<=n;i++)    fa[i]=i;
            for(int i=1;i<=tot;i++){
                int dx=find(edge[i].x);
                int dy=find(edge[i].y);
                if(dx==dy)    continue;
                fa[dx]=dy;
                ans+=edge[i].z;
                num++;
                if(num==n-1)    break;
            }
            if(num<n-1)    printf("0
    ");
            else
                printf("%.1lf
    ",ans*1.0/2*1.0);
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    在github上面查到了,为什么需要这个padding
    Java 8 新语法习惯,新的函数特性和语法
    数据库连接池配置,获取连接的超时
    用函数式的方式思考,通常以命令式的方式
    centos7 yum方式安装,centos自带mariadb
    mac屏幕脏了怎么办?避免使用粗糙的布
    用 Arthas “庖丁解牛,强大的 Arthas法师来 carry
    图解Knative核心组件,Serving自动伸缩
    vim配置文件
    20200717模拟赛3题解
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7416353.html
Copyright © 2020-2023  润新知