POJ1251

// recently followed kuangbin Gangster crazy water problem (ORZ)

// Prime minimum spanning tree algorithm 
#include <the iostream> 
#include <cstdio> 
#include <CString> 
#define INF (0x3f3f3f3f) 
the using namespace STD; 
const int MAXN = 35; 
int Grape [MAXN] [MAXN], D [ MAXN]; 
BOOL VIS [MAXN]; 
int n-; // number of nodes 
int pre [MAXN]; 
int Prime () 
{ 
    Memset (D, INF, the sizeof (D)); 
    Memset (pre, -1, the sizeof (pre )); 
    D [0] = 0; 
    the while (to true) 
    { 
        int minCost = INF, U = -1; 
        for (int = 0 V; = n-V;! V ++) 
        { 
            ! IF (VIS [V] && D [v] <mincost) // d [v] <inf then prove side reaches V 
            { 
                minCost = D [V];  
                U = V;
            }
        }
        if(mincost==inf)
            break;
        vis[u] = true;//用 u 节点更新 相邻节点
        for(int v=0;v!=n;++v)
        {
            if(Grape[u][v]!=-1&&!vis[v]&&Grape[u][v]<d[v])
            {
                d[v] = Grape[u][v];
                pre[v] = u;
            }
        }
    }
    int sum = 0;
    for(int v=0;v!=n;++v)
        if(pre[v]!=-1)
            sum += Grape[v][pre[v]];
    return sum;
}
int main()
{
    while(cin>>n&&n)
    {
        memset(Grape,-1,sizeof(Grape));// u ~ v -1表示 不存在边
        memset(vis,false,sizeof(vis));
        char u,v; int num,weight,sum = 0;//权值
        for(int i=0;i!=n-1;++i)
        {
            cin>>u>>num;
            while(num--)
            {
                cin>>v>>weight;
                Grape[u-'A'][v-'A'] = Grape[v-'A'][u-'A'] = weight;
                sum += weight;
            }
        }//建图
        cout<<Prime()<<endl;
    }
}

  

Guess you like

Origin www.cnblogs.com/newstartCY/p/11600955.html