题目
最小花费(cost)
【题目描述】
A村是个老村落,一共有n(1~n)户人家,为了让各家之间都能走动,政府想在这些人家之间修建道路,有些人家之间因为小河、小山的阻隔不能直达,导致一共有m条路可以规划,政府想花最少的钱将各个人家连接起来。请编程求最小花费。
【输入格式】
第一行两个正整数 n,m。
之后的 m 行,每行三个正整数 ui,vi,wi(1≤ ui,vi≤ n,0≤ wi≤10^9),描述一条连接人家 ui 和人家 vi的路,修建的花费为 wi 。
【输出格式】
一个整数表示最小花费。
【输入样例】
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
【输出样例】
16
【数据范围与提示】
1≤n≤ 2×10^5,0≤m≤5×10^5。
AC代码:
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define int long long
using namespace std;
int n,m,f[500009],ans,x,sum;
struct lol{
int from,to,val;
}l[500009];
bool cmp(lol a, lol b){
return a.val<b.val;
}
int find(int x){
if (f[x]==x) return x;
else return f[x]=find(f[x]);
}
void Kuskal(){
int a,b;
sort(l+1,l+1+m,cmp);
// cout<<l[1].val<<" "<<l[2].val<<endl;
for(int i=1; i<=m; i++){
a=find(l[i].from);
b=find(l[i].to);
if (a==b) continue;
sum+=l[i].val;
f[b]=a;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
scanf("%lld%lld",&n,&m);
for (int i=1; i<=n; i++) f[i]=i;
for (int i=1; i<=m; i++){
scanf("%lld%lld%lld",&l[i].from,&l[i].to,&l[i].val);
}
Kuskal();
printf("%lld",sum);
return 0;
}
原因分析:
不开long long见祖宗