zoj 1406 hdu 1301

本文介绍了一种使用 C 语言实现的最小生成树算法。通过输入顶点间边的权重,该程序能够找出连接所有顶点且总权重最小的树形结构。采用并查集进行节点合并,并利用快速排序对边按权重排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小生成树





#include<stdio.h>
#include<stdlib.h>
int m,n,f[27];
struct mapy
{
    int x,y,len;
}map[1000];
int cmp(const void *a,const void *b)
{
    return (*(struct mapy *)a).len-(*(struct mapy *)b).len;
}
int find(int a)
{
    if(a!=f[a])
        f[a]=find(f[a]);
    return f[a];
}
void dj()
{
    int sum,i,num;
    for(i=0;i<27;i++)
        f[i]=i;
    qsort(map,m,sizeof(map[0]),cmp);
    sum=0;num=0;
    for(i=0;i<m;i++)
    {
        if(find(map[i].x)!=find(map[i].y))
        {
            sum=sum+map[i].len;
            f[find(map[i].x)]=find(map[i].y);
            num++;
        }
        if(num==n-1)
            break;
    }
    printf("%d\n",sum);
}
int main()
{
    int i,j,t;
    char ch1,ch2;
    
    while(scanf("%d",&n)!=EOF&&n)
    {
        m=0;
        getchar();
        for(i=1;i<n;i++)
        {
            scanf("%c%d",&ch1,&t);
            for(j=1;j<=t;j++)
            {
                scanf(" %c%d",&ch2,&map[m].len);
                map[m].x=ch1-'A';
                map[m++].y=ch2-'A';
            }
            getchar();
        }
        dj();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值