图结构练习——最小生成树(克鲁斯卡尔方式)

题目描述

 有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
 
  
代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int bin[110];
int sum;
int num; //声明全局变量
struct node//创建结构体
{
    int u,v,w;//存储边的信息
}q[100000],t;

int finds(int a)//查找根结点+路径压缩
{
    if(a!=bin[a])
        a=finds(bin[a]);
    return a;
}

int main()
{
    int n,m;
    int i,j;
    int a,b,c;//声明变量
    while(~scanf("%d %d",&n,&m))//循环输入数据n和m的值
    {
        sum=0;//存储权值
        num=0;//存储边数
        for(i=1;i<=n;i++)
            bin[i]=i;   //初始化
        for(i=0;i<m;i++)
        {
            scanf("%d %d %d",&q[i].u,&q[i].v,&q[i].w);
        }
       for(i=0;i<m-1;i++)
          for(j=i+1;j<m;j++)
       {
           if(q[i].w>q[j].w)
           {
               t=q[i];
               q[i]=q[j];
               q[j]=t;
           }
       }
        for(i=0;i<m;i++)
        {
            int x=finds(q[i].u);
            int y=finds(q[i].v);
            if(x!=y)
            {
                sum+=q[i].w;//记录权值之和
                bin[y]=q[i].u;//合并
                num++;//边数加1
            }
            if(num==n-1)//最小生成树条件:边数=顶点数-1
            {
                break;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/macunshi/article/details/38850029