• Cx的治疗


     题目背景

    「Cx的故事」众所周知,Cx是一个宇宙大犇。由于Cx在空中花园失足摔下,导致他那蕴含着无穷智慧的大脑受到了严重的损伤,许多的脑神经断裂。于是,Cx的wife(有么?)决定请巴比伦最好的医师治疗。但是,Cx的wife是个十分吝啬的人,虽然她想将Cx治好,但是她又不肯出过多的钱,而脑神经的重新连接需要大量的花费。所以,当她知道来自未来的你时,她恳求你去帮她计算一下如何才能将Cx的神经元全部重新连接起来,而花费最小。

    题目描述

    神经网络就是一张无向图,图中的节点称为神经元,神经元已经按照1~N的顺序排好号,而且两个神经元之间至多有一条脑神经连接。

    现有N个神经元,M条仍然完好的脑神经,连接神经元Ai与Bi。

    医生给出能够连接的t条脑神经,分别连接神经元Aj与Bj,并给出连接所需的花费Ci。

    请编写程序计算将所有神经元连通的最小花费w。

    输入输出格式

    输入格式:

    第一行为两个整数N,M (1<=N<=10000,1<=M<=100000) 表示一共有N个神经元,有M条依旧完好的脑神经。

    接下来M行每行有两个整数Ai,Bi (1<=Ai,Bi<=10000) 表示神经元Ai,Bi已经连在一起。

    接下来一行有一个整数t (1<=t<=10000)表示医生能连接的神经个数。

    接下来t 行有三个整数 Aj ,Bj ,Cj (1<=Ai,Bi,Cj<=10000) 表示神经元Aj,Bj能通过Cj的花费将其连在一起。

    输出格式:

    仅一行,为一个整数,表示将Cx的神经元连通起来的最小花费w。若不能将其全部连通,请输出-1。

    输入输出样例

    输入样例#1:
    10 5
    1 5
    2 6
    3 7
    3 8
    3 9
    10
    2 4 10
    3 6 15
    2 4 9
    2 6 34
    5 7 64
    2 8 26
    3 7 16
    5 2 7
    3 9 13
    8 5 12
    
    输出样例#1:
    -1
    输入样例#2:
    10 5
    1 5
    2 6
    3 7
    3 8
    3 9
    10
    8 10 10
    3 6 15
    2 4 9
    2 6 34
    5 7 64
    2 8 26
    3 7 16
    5 2 7
    3 9 13
    8 5 12
    输出样例#2:
    38

    说明

    1<=N<=10000,0<=M<=100000;

    1<=Ai,Bi,Aj,Bj<=10000;

    1<=Cj<=100000;

    1<=t<=100000;

    思路

    由于某些原因,不能使用N2的prim;//1e8+常数,吾其还也。

    所以解法是kurskal.

    代码实现

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int maxn=1e4+10;
     5 const int maxm=1e5+1e4+10;
     6 int n,m,t,doc,ans;
     7 int a,b,c;
     8 struct edge{int s,t,f;}e[maxm];
     9 int f[maxn];
    10 int find_f(int k){return f[k]==k?k:f[k]=find_f(f[k]);}
    11 bool comp(const edge&a,const edge&b){return a.f<b.f;}
    12 int main(){
    13     scanf("%d%d",&n,&m);
    14     for(int i=1;i<=n;i++) f[i]=i;
    15     for(int i=1;i<=m;i++){
    16         scanf("%d%d",&a,&b);
    17         e[i]=(edge){a,b,c};
    18     }
    19     scanf("%d",&t);
    20     for(int i=m+1;i<=t+m;i++){
    21         scanf("%d%d%d",&a,&b,&c);
    22         e[i]=(edge){a,b,c};
    23     }
    24     sort(e+1,e+m+t+1,comp);
    25     for(int i=1;i<=t;i++){
    26         a=find_f(e[i].s),b=find_f(e[i].t);
    27         if(a!=b) doc++,ans+=e[i].f,f[b]=a;
    28     }
    29     if(doc==n-1) printf("%d
    ",ans);
    30     else puts("-1");
    31     return 0;
    32 }
  • 相关阅读:
    四色定理+dfs(poj 1129)
    栈的应用:表达式求值运算
    多重背包 (poj 1014)
    poj 1080 (LCS变形)
    KMP算法(快速模式匹配)
    贪心+构造( Codeforces Round #344 (Div. 2))
    JavaScript Ajax
    Canvas绘图
    TCP/IP协议
    移动端click事件延迟300ms到底是怎么回事,该如何解决?
  • 原文地址:https://www.cnblogs.com/J-william/p/7191562.html
Copyright © 2020-2023  润新知