Prime邻接表+优先队列

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 103

struct Edge
{
    int e, w;
    Edge(int e=0,int w=0): e(e), w(w) {}
    friend bool operator < (Edge A, Edge B)
    {
        return A.w < B.w;
    }
};

vector<Edge> G[maxn];
int dist[maxn];
bool vis[maxn];
int m, n;
int Prime()
{
    Edge P, Pn;
    int Nnode = 0;
    dist[1] = 0;
    priority_queue < Edge > Q;
    Q.push( Edge(1,0) );

    while( !Q.empty() && Nnode < n )
    {
        while( !Q.empty() )
        {
            P = Q.top();
            Q.pop();
            if( !vis[P.e] )
                break;
        }
        if( vis[P.e] )
            continue;
        Nnode ++;
        vis[P.e] = true;
        int len = G[P.e].size();

        for(int i=0; i<len; i++)
        {
            Pn = G[P.e][i];

            if(!vis[Pn.e] && dist[Pn.e] > Pn.w)
            {
                dist[Pn.e] = Pn.w;
                Q.push(Pn);
            }
        }
    }
    if(Nnode < n)
        return -1;

    int sum = 0;
    for(int i=1; i<=n; i++)
    {
        sum += dist[i];
    }

    return sum;
}

void Init()
{
    for(int i=0; i<=n; i++)
    {
        G[i].clear();
        dist[i] = INF;
        vis[i] = false;
    }
}


int main()
{
    while(cin >> m >> n, m)
    {
        Init();
        for(int i=0; i<m; i++)
        {
            int a, b, c;
            cin >> a >> b >> c;

            G[a].push_back( Edge(b,c) );
            G[b].push_back( Edge(a,c) );

        }

        int ans = Prime();

        if(ans == -1)
            cout << "?" << endl;
        else
            cout << ans << endl;

    }
    return 0;
}

 

posted @ 2014-12-31 15:10  向前走丶不回首  阅读(239)  评论(0编辑  收藏  举报