• A


    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

    ice_cream’s world becomes stronger and stronger; every road is built as undirected. The queen enjoys traveling around her world; the queen’s requirement is like II problem, beautifies the roads, by which there are some ways from every city to the capital. The project’s cost should be as less as better.
     

    Input

    Every case have two integers N and M (N<=1000, M<=10000) meaning N cities and M roads, the cities numbered 0…N-1, following N lines, each line contain three integers S, T and C, meaning S connected with T have a road will cost C.
     

    Output

    If Wiskey can’t satisfy the queen’s requirement, you must be output “impossible”, otherwise, print the minimum cost in this project. After every case print one blank.
     

    Sample Input

    2 1 0 1 10 4 0
     

    Sample Output

    10 impossible
    简单的最小生成树问题,用并查集来做。
     1 #include<cstdio>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 int ans;
     6 int father[2000],rank[2000];//父节点,深度记录(这道题没必要用深度记录)
     7 //int max1;
     8 struct Line{
     9     int first;
    10     int last;
    11     int cost;
    12 }line[50000];//还没学会用数组来记录边,还是在用结构体做的,编程风格有待提高
    13 int cmp(Line a,Line b){return a.cost<b.cost;}//排序的依据函数
    14 int find(int x)//找点的父节点,把一条边的点搞到一个集合里面
    15 {
    16     if(father[x]!=x)
    17     {
    18         father[x]=find(father[x]);//这里有个优化,不会出现长链的情况,直接把father[x]=find[father[x]];
    19     }
    20     return father[x];
    21 }
    22 bool Union(int a,int b)//合并集合
    23 {
    24     int a1=find(a),b1=find(b);
    25     if(a1==b1) return false;//如果是同一个父亲节点的,return false;
    26     else{
    27         father[b1]=a1;//否则合并成一个集合
    28         ans++;
    29         rank[a1]+=rank[b1];
    30         if(max1<rank[a1]) max1=rank[a1];
    31         return true;
    32     }
    33 }
    34 
    35 
    36 int main()
    37 {
    38     int a,b,c,n,m;
    39     while(scanf("%d%d",&n,&m)!=EOF)
    40     {
    41         for(int i=0;i<n;i++)
    42         {
    43             father[i]=i;
    44             rank[i]=1;
    45         }
    46         for(int i=1;i<=m;i++)
    47         {
    48             scanf("%d %d %d",&a,&b,&c);
    49             line[i].first=a;
    50             line[i].last=b;
    51             line[i].cost=c;
    52 
    53         }
    54         sort(line+1,line+m+1,cmp);
    55         max1=0;
    56         int sum=0;
    57         ans=0;
    58         for(int i=1;i<=m;i++)
    59         {
    60             if(Union(line[i].first,line[i].last))
    61                 sum+=line[i].cost;
    62         }
    63         if(ans==n-1) printf("%d
    ",sum);
    64         else printf("impossible
    ");
    65         printf("
    ");
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    k8s命令总结
    AttributeError: module 'enum' has no attribute 'IntFlag'
    程序员是如何思考的?
    2、Swift协程详解:用async函数替换回调
    7、Swift协程详解:异步函数的调度和GlobalActor
    6、Swift协程详解:属性隔离和Actor
    1、Swift协程详解:协程简介
    3、Swift协程详解:调用协程
    8、Swift协程详解:TaskLocal
    9、Swift协程详解:其他语言异步函数互调用
  • 原文地址:https://www.cnblogs.com/angledamon/p/3909014.html
Copyright © 2020-2023  润新知