zoukankan      html  css  js  c++  java
  • pat06-图6. 公路村村通(30)

    06-图6. 公路村村通(30)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

    输入格式说明:

    输入数据包括城镇数目正整数N(<=1000)和候选道路数目M(<=3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

    输出格式说明:

    输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出-1,表示需要建设更多公路。

    样例输入与输出:

    序号 输入 输出
    1
    6 15
    1 2 5
    1 3 3
    1 4 7
    1 5 4
    1 6 2
    2 3 4
    2 4 6
    2 5 2
    2 6 6
    3 4 6
    3 5 1
    3 6 1
    4 5 10
    4 6 8
    5 6 3
    
    12
    
    2
    3 1
    2 3 2
    
    -1
    
    3
    5 4
    1 2 1
    2 3 2
    3 1 3
    4 5 4
    
    -1
    

    提交代码

    边是点的线性关系,因此用Kruskal算法。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 #include<cmath>
     8 #include<string>
     9 using namespace std;
    10 int f[1005];
    11 struct node{
    12     int u,v,cost;
    13 };
    14 bool cmp(node a,node b){
    15     return a.cost<b.cost;
    16 }
    17 int findfa(int a){//返回父节点
    18     if(a!=f[a]){
    19         f[a]=findfa(f[a]);
    20     }
    21     return f[a];//注意,这里返回f[a]!!
    22 }
    23 int main(){
    24     //freopen("D:\INPUT.txt","r",stdin);
    25     int n,m;
    26     scanf("%d %d",&n,&m);
    27     int i;
    28     node *load=new node[m];
    29     for(i=0;i<=n;i++){
    30         f[i]=i;
    31     }
    32     for(i=0;i<m;i++){
    33         scanf("%d %d %d",&load[i].u,&load[i].v,&load[i].cost);
    34     }
    35     sort(load,load+m,cmp);
    36     int num=1,cur=0,mincost=0;
    37 
    38     //cout<<num<<endl;
    39 
    40     /*for(i=0;i<m;i++){
    41         cout<<load[i].cost<<endl;
    42     }*/
    43 
    44     while(num<n&&cur<m){
    45         int ufa=findfa(load[cur].u);
    46         int vfa=findfa(load[cur].v);
    47         if(ufa>vfa){
    48             f[vfa]=ufa;
    49             mincost+=load[cur].cost;
    50             num++;
    51         }
    52         else{
    53             if(vfa>ufa){
    54                 f[ufa]=vfa;
    55                 mincost+=load[cur].cost;
    56                 num++;
    57             }
    58         }
    59         cur++;
    60     }
    61 
    62     if(num==n){
    63         printf("%d
    ",mincost);
    64     }
    65     else{
    66         printf("-1
    ");
    67     }
    68     delete []load;
    69     return 0;
    70 }
  • 相关阅读:
    商标查询网
    java: jsp:param中文乱码
    java:maven中webapp下的jsp不能访问web-inf下面的bean
    java:类集回顾
    java:类集操作,多对多的关系
    java:类集操作总结
    java:练习学校学生
    php发邮件:swiftmailer, php邮件库——swiftmailer
    java:练习超市卖场
    phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4756382.html
Copyright © 2011-2022 走看看