这是一个板子题,适合于初学最小生成树的人练手
点击这里查看题目(https://www.luogu.org/problemnew/show/P3366)
当然,如题,这里只有prim的代码
注意:
1.prim用邻接链表存边时应注意数组大小与无向边的问题
2.优先队列排序默认按照第一关键字排序
3.输入数据过大时可能需要快读优化
4.代码已压行,请小心使用
5.欢迎各界dalao指出本蒟蒻的错误
奉上代码:
#include<bits/stdc++.h> using namespace std; typedef pair <int,int> pii; priority_queue <pii,vector<pii>,greater<pii> > q; struct node{int to,val,next;}e[400010]; int vis[400010],n,m,ans,u=1,k,head[400010],mi,cnt; void add(int x,int y,int z){e[++k].to=y,e[k].val=z,e[k].next=head[x],head[x]=k;} inline void read(int &x) { x=0;int f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0',ch=getchar();}x*=f; } int main() { read(n),read(m); for(int i=1;i<=m;i++) { int a,b,c; read(a),read(b),read(c); add(a,b,c),add(b,a,c); } q.push(make_pair(0,1)); while(!q.empty()&&cnt<=n) { int u=q.top().second,v=q.top().first; q.pop(); if(vis[u])continue; cnt++,ans+=v,vis[u]=1; for(int i=head[u];i!=0;i=e[i].next) if(!vis[e[i].to]) q.push(make_pair(e[i].val,e[i].to)); } cout<<ans; return 0; }