• 图结构练习——最小生成树(kruskal算法(克鲁斯卡尔))


    图结构练习——最小生成树

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描述

     有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
     

    输入

     输入包含多组数据,格式如下。
    第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
    剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
     

    输出

     每组输出占一行,仅输出最小花费。

    示例输入

    3 2
    1 2 1
    1 3 1
    1 0
    

    示例输出

    2
    0
    
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 struct vode
     5 {
     6     int u,v,w;
     7 }edge[70000];
     8 int m,n;
     9 int f[70000];
    10 int cmp(const void *a,const void *b)//注意此函数的使用方法和定义方法
    11 {
    12     struct vode *c=(struct vode *)a;
    13     struct vode *d=(struct vode *)b;
    14     return c->w-d->w;
    15 }
    16 int find(int v)
    17 {
    18     int t=v;
    19     while(f[t]!=0)//此语句目的是寻找节点v的根节点
    20     t=f[t];
    21     return t;
    22 }
    23 int krusal()
    24 {
    25     memset(f,0,sizeof(f));
    26     int i,root1,root2;
    27     int sum=0;
    28     for(i=0;i<n;i++)
    29     {
    30         root1=find(edge[i].u);//dege[i].u所在树的根节点
    31         root2=find(edge[i].v);//edge[i].v所在树的根节点
    32         if(root1!=root2)//两棵树的根节点不同,说明edge[i].u和edge[i].v在不同的两棵树上
    33         {
    34             f[root2]=root1;//将两棵树合并成一棵树
    35             sum=sum+edge[i].w;//权值累计
    36         }
    37     }
    38     return sum;
    39 }
    40 int main()
    41 {
    42     while(~scanf("%d%d",&m,&n))
    43     {
    44         int i;
    45         for(i=0;i<=n-1;i++)
    46         {
    47             int u,v,w;
    48             scanf("%d%d%d",&u,&v,&w);
    49             edge[i].u=u;
    50             edge[i].v=v;
    51             edge[i].w=w;
    52         }
    53         qsort(edge,n,sizeof(struct vode),cmp);//用c++的快速排序法根据权值大小从小到大将边排序,注意cmp的使用方法
    54         int sum=krusal();
    55         printf("%d
    ",sum);
    56     }
    57     return 0;
    58 }
    View Code

    本题还有不明之处:题目限定节点的数目在0~100之间,那么,边的数目就在0~100*99/2=4950之间,为什么我数组开到了5000,甚至7000都不行,开到了8000的时候提交才过,路过的大神若是明白就给我讲解一下吧,小弟不胜感激~

  • 相关阅读:
    toj 2975 Encription
    poj 1797 Heavy Transportation
    toj 2971 Rotating Numbers
    zoj 2281 Way to Freedom
    toj 2483 Nasty Hacks
    toj 2972 MOVING DHAKA
    toj 2696 Collecting Beepers
    toj 2970 Hackle Number
    toj 2485 Card Tric
    js页面定位,相关几个属性
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3245349.html
Copyright © 2020-2023  润新知