问题描述
试题编号: | 201412-4 |
试题名称: | 最优灌溉 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。 输入格式 输入的第一行包含两个正整数n, m,分别表示麦田的片数和雷雷可以建立的水渠的数量。麦田使用1, 2, 3, ……依次标号。 输出格式 输出一行,包含一个整数,表示灌溉所有麦田所需要的最小费用。 样例输入 4 4 样例输出 6 样例说明 建立以下三条水渠:麦田1与麦田2、麦田2与麦田4、麦田4与麦田3。 评测用例规模与约定 前20%的评测用例满足:n≤5。 |
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y,w;
node(){
x=y=w=0;
}
node(int x,int y,int w):x(x),y(y),w(w){
}
};
vector<node> vec;
int f[1005];
int sum=0;
int c=0;
bool cmp(node n1,node n2)
{
return n1.w<n2.w;
}
int find(int v)
{
if(f[v]==v)
{
return v;
}
else
{
return f[v]=find(f[v]);
}
}
int merge(int x,int y)
{
int t1=find(x);
int t2=find(y);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
void krusual(int n,int m)
{
for(int i=1;i<=n;i++)
{
f[i]=i;
}
for(int i=1;i<=m;i++)
{
if(merge(vec[i].x,vec[i].y))
{
sum+=vec[i].w;
c++;
}
if(c==n-1)
break;
}
cout<<sum<<endl;
}
int main(int argc, char** argv)
{
int n,m;
cin>>n>>m;
vec.push_back(node(0,0,-10));
for(int i=0;i<m;i++)
{
int x,y,w;
cin>>x>>y>>w;
vec.push_back(node(x,y,w));
}
sort(vec.begin(),vec.end(),cmp);
krusual(n,m);
return 0;
}