最小生成树 堆优化的Prim算法

来源:互联网 发布:淘宝卖家中心登录网 编辑:程序博客网 时间:2024/06/03 08:20
#include <cstdio>#include <iostream>#include <queue>#include <vector>#include <cstring>#include <algorithm>#include <string>#include <map>#include <set>using namespace std;int n,m;const int maxn = 1e5;struct node{    int x;int d;    node(){};    node(int xx,int dd):x(xx),d(dd){};    bool operator < (const node& a) const    {        return d > a.d;    }};vector<node>edge[maxn];bool book[maxn];int prime(){    memset(book,false,sizeof(book));    priority_queue<node>q;    q.push(node(1,0));    long long sum = 0;    int cnt = 0;///记录加入多少边了    while(!q.empty() && cnt < n)    {        node now = q.top();        q.pop();        if(book[now.x]) continue;        book[now.x] = true;        sum += now.d;        cnt++;        for(int i = 0;i < edge[now.x].size();i++)        {            if(!book[edge[now.x][i].x])                q.push(node(edge[now.x][i].x,edge[now.x][i].d));        }    }    return sum;}int main(){    while(cin >> n >> m)    {        for(int i =0;i <= n;i++)            edge[i].clear();        int a,b,d;        while(m--)        {            cin >> a >> b >> d;            edge[a].push_back(node(b,d));            edge[b].push_back(node(a,d));        }        long long len = prime();        cout << len << endl;    }    return 0;}

原创粉丝点击