題目:
爲了灌溉,雷雷需要建立一些水渠,以連接水井和麥田,雷雷也可以利用部分麥田作爲“中轉站”,利用水渠連接不同的麥田,這樣只要一片麥田能被灌溉,則與其連接的麥田也能被灌溉。
現在雷雷知道哪些麥田之間可以建設水渠和建設每個水渠所需要的費用(注意不是所有麥田之間都可以建立水渠)。請問灌溉所有麥田最少需要多少費用來修建水渠。
接下來m行,每行包含三個整數ai, bi, ci,表示第ai片麥田與第bi片麥田之間可以建立一條水渠,所需要的費用爲ci。
1 2 1
2 3 4
2 4 2
3 4 3
前40%的評測用例滿足:n≤20。
前60%的評測用例滿足:n≤100。
所有評測用例都滿足:1≤n≤1000,1≤m≤100,000,1≤ci≤10,000。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define MAX 1007
typedef struct{
int x,y,c;
}NODE;
NODE e[MAX*MAX];
int id[MAX];
bool cmp(NODE x,NODE y){
return x.c<y.c;
}
int find(int x){
if(id[x] == x)return x;
else return id[x]=find(id[x]);
}
void Union(int x,int y){
int a=find(x),b=find(y);
id[a]=b;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;++i)
cin>>e[i].x>>e[i].y>>e[i].c;
sort(e,e+m,cmp);
for(int i=0;i<=n;++i)id[i]=i;
ll ans=0;
for(int i=0;i<m;++i){
if(find(e[i].x) != find(e[i].y)){
Union(e[i].x,e[i].y);
ans = ans + e[i].c;
}
}
cout<<ans<<endl;
// for(int i=0;i<m;++i)
// cout<<e[i].x<<e[i].y<<e[i].c<<endl;
return 0;
}