A - Jungle Roads - poj 1251(简单)

时间:2024-04-28 18:04:48
想必看这道题的时候直接看数据还有那个图就能明白什么意思吧,说的已经很清楚了,每个点都有一些相连的点和权值,求出来如果连接所有点,最小的权值是多少,赤裸裸的最小生成树。。。
************************************************************************************
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std; #define maxn 30 struct node
{
    int v, len;
    node(int v, int len):v(v),len(len){}
    friend bool operator < (node a, node b){
        return a.len > b.len;
    }
};
vector<node> G[maxn]; int prim(int s)
{
    int i, ans=, use[maxn]={}, M;
    priority_queue<node> Q;
    use[s] = ;     for(i=, M=G[s].size(); i<M; i++)
        Q.push(G[s][i]);     while(Q.size())
    {
        node q = Q.top();Q.pop();         if(use[q.v] == )
        {
            for(i=, M=G[q.v].size(); i<M; i++)
                Q.push(G[q.v][i]);
            use[q.v] = , ans += q.len;
        }
    }     for(i=; i<maxn; i++)
        G[i].clear();     return ans;
} int main()
{
    int N;     while(scanf("%d", &N) != EOF && N)
    {
        int i, u, v, len, M;
        char s[];         for(i=; i<N; i++)
        {
            scanf("%s%d", s, &M);
            u = s[] - 'A';
            while(M--)
            {
                scanf("%s%d", s, &len);
                v = s[] - 'A';
                G[u].push_back(node(v, len));
                G[v].push_back(node(u, len));
            }
        }         int ans = prim(u);         printf("%d\n", ans);
    }     return ;
}