修路--Kruskal裸

Kruskal裸题,没什么好说的传送门

Description
假期到了,xab出去兼职修路,现在有n个地点,编号为1-n,给定了m条道路要修,并给定你修这些道路所需费用,要使得任意两个地方都相通,要你求出这个最小的费用

Input
第一行两个正整数n ( 1 <= n <= 2 10^5 ) , m ( 0 <= m <= 5 10^5 ) 。
之后的m行,每行三个正整数 u ( 1 <= u <= n ) , v(1 <= v <= n ) , w ( 0 <= w <= 10 ^9 ),表示修u到v的路需要费用为w元。

Output
最小费用

Sample Input

7 12
1 2 9
1 5 2
1 6 3
2 3 5
2 6 7
3 4 6
3 7 3
4 5 6
4 7 2
5 6 3
5 7 6
6 7 1

Sample Output

16

 第一次没过是因为用的int,long long就可以过了。
 然后用的邝斌的板子

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll MAXM;
ll MAXN;
ll F[500005];//并查集使用

struct Edge{
ll u,v,w;
}edge[500005];//存储边的信息,包括起点/终点/权值
ll tol;//边数,加边前赋值为 0
void addedge(ll u,ll v,ll w){
edge[tol].u=u;
edge[tol].v=v;
edge[tol++].w=w;
}
//排序函数,讲边按照权值从小到大排序
bool cmp(Edge a,Edge b){
return a.w<b.w;
}
ll find(ll x){
if(F[x]==-1)return x;
else return F[x]=find(F[x]);
}
//传入点数,返回最小生成树的权值,如果不连通返回 -1
ll Kruskal(ll n){
memset(F,-1,sizeof(F));
sort(edge,edge+tol,cmp);
ll cnt=0;//计算加入的边数
ll ans=0;
for(ll i=0;i<tol;i++){
ll u=edge[i].u;
ll v=edge[i].v;
ll w=edge[i].w;
ll t1=find(u);
ll t2=find(v);
if(t1!=t2){
ans+=w;
F[t1]=t2;
cnt++;
}
if(cnt==n-1)break;
}
if(cnt<n-1)return -1;//不连通
else return ans;
}
int main(){
cin>>MAXN>>MAXM;
for(ll i=0;i<MAXM;i++){
ll u,v,w;
cin>>u>>v>>w;
addedge(u,v,w);
}
cout<<Kruskal(MAXN);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值