其他分享
首页 > 其他分享> > 最小生成树:洛谷P3366【模板】最小生成树

最小生成树:洛谷P3366【模板】最小生成树

作者:互联网

https://www.luogu.com.cn/problem/P3366

Prim算法/最小生成树裸题:不断取出未加入集合的点中距离最近的那个,并将其连的所有边加入priority_queue中(priority_queue重载运算符<然后用node),反复循环直到priority_queue为空

重点:priority_queue的使用

#include<bits/stdc++.h>
#define INF 2147483647
using namespace std;
int been[5003];
struct node{
    int num,to,value;
};
bool operator < (const node &a, const node &b){
    return a.value > b.value;
} 
int main(){
    vector<node>a[5003];
    priority_queue<node> q;
    int n,m,i,x,y,z,ans,ansn;
    node t;t.value=INF;
    memset(been,0,sizeof(been));
    cin>>n>>m;
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);
        node b,c;
        b.num=x;b.to=y;b.value=z;
        c.num=y;c.to=x;c.value=z;
        if(z<t.value) t=b;
        a[x].push_back(b);
        a[y].push_back(c);
    }
    t.to=t.num;t.value=0;q.push(t);
    ans=0;ansn=0;
    while(!q.empty()){
        node b=q.top();q.pop();x=b.to;
        if(been[x]) continue;
        ans+=b.value;ansn++;
        been[x]=true;
//        printf("%d->%d:%d\n",b.num,b.to,b.value);
        for(i=0;i<a[x].size();i++){
            if(!been[a[x][i].to]) q.push(a[x][i]);
        }    
    }
    if(ansn==n) cout<<ans; else cout<<"orz";
} 

 

标签:node,queue,int,最小,value,生成,priority,been,P3366
来源: https://www.cnblogs.com/gaters/p/15518033.html