最小生成树(Prim)

Prim模板

O(NlogN)

#include<bits/stdc++.h>
using namespace std;
#define init(array,x) memset(array,x,sizeof(array))
const int maxn = 1e5+99;
int n,m,ans,vis[maxn];
struct node{
	int to,w;
	bool operator < (const node tmp)const{
		return tmp.w<w;
	}
};
vector<node> d[maxn];
priority_queue<node>q;
void Prim(int x){
	int tot=0;ans=0;
	q.push({x,0});
	while(tot<=n&&!q.empty()){
		node t = q.top();
		q.pop();
		int tmp=t.to;
		if(vis[tmp])continue;
		vis[tmp]=1;
		ans+=t.w;
		tot++;
		for(int i=0;i<d[tmp].size();i++){
			int to=d[tmp][i].to,w=d[tmp][i].w;
			if(!vis[to]){
				q.push(d[tmp][i]);
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1,a,b,w;i<=m;i++)cin>>a>>b>>w,d[a].push_back({b,w}),d[b].push_back({a,w});
	Prim(1);
	cout<<ans;
	return 0;
}
posted @ 2021-01-29 11:58  蒟蒻orz  阅读(3)  评论(0编辑  收藏  举报  来源