1006 Problem F


题意:对于一些地点,它们都有路相连,这些路每年都需要维修,并且成本不同,问最小的维修费是多少。先输入一个n,再输入n-1行,每行都是先输入一个字母和一个数字a,再输入a组的一个字母和一个数字(该数字是维修费)。

思路:求道路最小维修费用,即最小生成树问题,使用kruskal算法,将道路维修费用排序,然后利用并查集,得到最小生成树。

感想:题目给出的地点是字母,将其转化为数字,然后按照kruskal算法模板求解即可。

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<stdlib.h>

#include<cmath>

using namespace std;

int parent[30];

int cnt,ans;

struct edge{

   int u,v,w;

}eg[80];

bool cmp(edge a,edge b){

   return a.w<b.w;

}

int find(int x){

   if(parent[x]==-1)

       return x;

   return find(parent[x]);

}

void kruskal(){

   ans=0;

   memset(parent,-1,sizeof(parent));

   sort(eg,eg+cnt,cmp);

   for(int i=0;i<cnt;i++){

       int x=find(eg[i].u);

       int y=find(eg[i].v);

       if(x!=y){

            ans+=eg[i].w;

           parent[x]=y;

       }

    }

}

int main(){

   int n,k,d;

   char c1,c2;

   while(cin>>n&&n){

       cnt=0;

       for(int i=1;i<n;i++){

           cin>>c1>>k;

           while(k--){

                cin>>c2>>d;

                eg[cnt].u=c1-'A'+1;

                eg[cnt].v=c2-'A'+1;

                eg[cnt].w=d;

                cnt++;

           }

       }

       kruskal();

       printf("%d\n",ans);

    }

   return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值