(http://acm.hdu.edu.cn/showproblem.php?pid=1301)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std ;
const int MAX_VETEXT_NUM = 26;//最大的顶点数
const int MAX_EDGE_NUM = 75;//最大的边数
struct Edge
{
int begin;//起点
int end;//结点
double cost;//边的权值
};
Edge edge[MAX_EDGE_NUM];//边集合
double sum=0;
int ConnectedList[MAX_VETEXT_NUM];//连通分量静态链表
int nEdges; //边的数目
int nVetexs; //顶点数目
int Find( int ConnectedList[],int v)
{//若v所在的连通分量静态链表为空,则返回参数v,否则返回其所在链表的表尾元素
while(ConnectedList[v]>0)
v=ConnectedList[v];
return v ;
}
bool cmp(const Edge&a,const Edge&b)
{//根据边权值从小到大排序
return a.cost<b.cost ;
}
void Kruscal()
{
int i,j ;//i和j分别为已有生成树中边和顶点数目
int v1,v2;
//初始化连通分量静态链表为空
for (i=0;i<nVetexs;i++)
ConnectedList[i]=0;
i=0,j=0;
while(j<nVetexs-1&&i<nEdges)
{
v1=Find(ConnectedList,edge[i].begin);
v2=Find(ConnectedList,edge[i].end);
if(v1!=v2)
{ //起点和终点不在同一个连通分量
sum+=edge[i].cost;
ConnectedList[v1]=v2 //加入连通分量链表中
++j;//最小生成树边数加1
}
++i;//处理完一条边
}
}
int main()
{
int i,j;
int num;
double cost;
char chStart,chEnd;
while (cin>>nVetexs&&nVetexs!=0)
{
sum=0;
nEdges=0;
for ( i=0;i<nVetexs-1;i++)
{
cin>>chStart>>num;
for(j=0;j<num;j++)
{ //建立连通分量静态链表
cin>>chEnd>>cost ;
edge[nEdges].begin=chStart-'A';
edge[nEdges].end=chEnd-'A';
edge[nEdges].cost=cost;
nEdges++;
}
}
sort(edge,edge+nEdges,cmp);
Kruscal();
cout<<sum<<endl;
}
return 0 ;
}