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;

}

 

你可能感兴趣的:(优先队列)