• nyoj38


    布线问题

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
    1、把所有的楼都供上电。
    2、所用电线花费最少
     
    输入
    第一行是一个整数n表示有n组测试数据。(n<5)
    每组测试数据的第一行是两个整数v,e.
    v表示学校里楼的总个数(v<=500)
    随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)
    随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 )
    (楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。
    数据保证至少存在一种方案满足要求。
    输出
    每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。
    样例输入
    1
    4 6
    1 2 10
    2 3 10
    3 1 10
    1 4 1
    2 4 1
    3 4 1
    1 3 5 6
    样例输出
    4

    与一道省赛题目类似,走了弯路,这个要求只能有一个结点与虚拟结点连接,所以先对n个点求出一个MST再找出最小的虚拟节点与这个树的权值,加上这个权值就是答案!

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊笨死了啊

    #include<bits/stdc++.h>
    using namespace std;
    #define N 205005
    int u[N],v[N],w[N],r[N];
    bool cmp(int i,int j){return w[i]<w[j];}
    int n,m;
    int f[505];
    int getf(int v){return f[v]==v?v:f[v]=getf(f[v]);}
    int main()
    {
    int t,n,m,i,j,k;
    int a,b,c;
    cin>>t/*=read()*/;
    while(t--){
    cin>>n>>m;
    for(i=0;i<=n;++i) f[i]=i;
    for(i=1;i<=m;++i) {r[i]=i;
    cin>>u[i]/*=read(),*/>>v[i]/*=read(),*/>>w[i]/*=read()*/;
    }
    sort(r+1,r+m+1,cmp);
    int sumn=0,Count=0;
    for(i=1;i<=m&&Count!=n-1;++i){
    int e=r[i],x=getf(u[e]),y=getf(v[e]);
    if(x!=y){
    Count++;
    f[y]=x;
    sumn+=w[e];
    }
    }int ans=999999999,x;
    for(i=1;i<=n;++i){cin>>x;ans=min(x,ans);}
    cout<<sumn+ans<<endl;
    }
    return 0;
    }

  • 相关阅读:
    github入门到上传本地项目
    17-索引
    16-pymysql模块的使用
    15-可视化工具Navicat的使用
    C语言/C++知识
    Apk反编译那些事
    CTF基本常识
    WebView net::ERR_CLEARTEXT_NOT_PERMITTED&&net::ERR_INTERNET_DISCONNECTED
    测试
    zookeeper-3.4.5安装&3台机器安装之后 ./zkServer.sh status 之后会显示“Error contacting service. It is probably not running.”的解决办法
  • 原文地址:https://www.cnblogs.com/zzqc/p/6724066.html
Copyright © 2020-2023  润新知