POJ 1251 Jungle Roads

传送门:http://poj.org/problem?id=1251

解题思路:简单的最小生成树

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;

const int maxn=28;
struct Edge{
    int u,v,w;
    bool operator <(const Edge &rhs) const{
        return w<rhs.w;
    }
}edges[maxn*maxn];
int f[maxn];

void init(int N){
    for(int i=1;i<=N;i++)
        f[i]=i;
}

int findfa(int a){
    if(f[a]!=a)
        f[a]=findfa(f[a]);
    return f[a];
}

void unit(int a,int b){
    int fa=findfa(f[a]);
    int fb=findfa(f[b]);

    if(fa!=fb)
        f[fa]=f[fb];
}

int m=0;
void addEdge(int u,int v,int w){
    edges[m].u=u;
    edges[m].v=v;
    edges[m].w=w;
    m++;
}

int  prime(int N){
    init(N);

    sort(edges,edges+m);

    int ans=0;
    for(int i=0;i<m;i++){
        if(findfa(edges[i].u)!=findfa(edges[i].v)){
            ans+=edges[i].w;
            unit(edges[i].u,edges[i].v);
        }
    }
    return ans;
}

int main(){
    int N;
    while(scanf("%d",&N)!=EOF&&N!=0){
        m=0;
        for(int i=1;i<N;i++){
            char s[3],e[3];
            int t,w;
            scanf("%s",s);
            scanf("%d",&t);
            for(int k=0;k<t;k++){
                scanf("%s",e);
                scanf("%d",&w);
                addEdge(s[0]-'A'+1,e[0]-'A'+1,w);
            }

        }

      printf("%d\n",prime(N));
    }
    return 0;
}

 

posted on 2017-03-05 10:35  mkfoy  阅读(165)  评论(0编辑  收藏  举报

导航