1301-Jungle Roads

来源:互联网 发布:浙江基层网络直报 编辑:程序博客网 时间:2024/05/21 15:03

(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 ; }
0 0
原创粉丝点击