(记录一道很秒的题目,主要是记录下定义小根堆的用法)
题目链接 http://lk.yali.edu.cn/problem/22
题解 http://lk.yali.edu.cn/blogof/root/blog/25 (出题人已经说的很清楚了)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int n,m;
int fa[200003];
struct arr {
int a,b;
long long c;
};
struct cmp {
bool operator() (arr qaq,arr qwq){
return qaq.c>qwq.c;
};
};
//以前不是这样写的,之前写的一种格式一直都记不住,这个好理解多了
priority_queue<arr,vector<arr>,cmp>q;
inline int read() {
int x=0,w=1;char ch;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
return x*w;
}
int gf(int x) { return fa[x]==x?x:fa[x]=gf(fa[x]);}
int main() {
n=read();m=read();
while(m--) {
int a=read(),b=read(),c=read();
q.push((arr){a%n,b%n,c});
q.push((arr){b%n,(a+1)%n,c+1});
}
for(register int i=0;i<n;++i) fa[i]=i;
long long ans=0;
int k=n-1;
while(k) {
int a=q.top().a,b=q.top().b;long long c=q.top().c;
q.pop();
int u=gf(a),v=gf(b);
if(u!=v) {
fa[u]=v;
ans+=c;
k--;
if(gf((a+1)%n)!=gf((b+1)%n)) q.push((arr){(a+1)%n,(b+1)%n,c+2});
}
}
cout<<ans<<endl;
return 0;
}
小根堆与并查集优化MST算法

本文介绍了一种使用小根堆和并查集的数据结构优化最小生成树(MST)算法的实现方法。通过优先队列高效处理边的权重,结合并查集判断连通性,实现了对Kruskal算法的有效优化。文章提供了完整的代码示例,展示了如何在竞赛编程中快速构建高效的MST求解器。
3万+

被折叠的 条评论
为什么被折叠?



