1006 Problem F


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

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

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

#include

#include

#include

#include

#include

#include

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

}

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

       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

           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;

}

你可能感兴趣的:(图)