试题编号: | 201412-4 |
试题名称: | 最优灌溉 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。 输入格式 输入的第一行包含两个正整数n, m,分别表示麦田的片数和雷雷可以建立的水渠的数量。麦田使用1, 2, 3, ……依次标号。 输出格式 输出一行,包含一个整数,表示灌溉所有麦田所需要的最小费用。 样例输入 4 4 样例输出 6 样例说明 建立以下三条水渠:麦田1与麦田2、麦田2与麦田4、麦田4与麦田3。 评测用例规模与约定 前20%的评测用例满足:n≤5。 |
我现在才知道原来是可以套模板的。。
为什么要带书考试原来是这样的吗?
这是我第一次用二十分钟就写完了第四题,一次AC。
这道题一看就是最小生成树,kruskal.
#include <iostream>
#include <bits/stdc++.h>
#define maxn 1005
using namespace std;
struct Node
{
int a;
int b;
int w;
};
int n,m;
int p[maxn];
vector<Node>nodes;
bool cmp(const Node s,const Node t)
{
return s.w<t.w;
}
int Find(int x)
{
if(p[x] == x)
return x;
else
return p[x] = Find(p[x]);
//return p[x] == x?x:p[x] = Find(p[x]);
}
int Kruskal()
{
long long ans = 0;
int i;
for(i = 1;i<=n;i++)
p[i] = i;
for(i = 0;i<m;i++)
{
int x = Find(nodes[i].a);
int y = Find(nodes[i].b);
if(x!=y)
{
ans += nodes[i].w;
p[x] = y;
}
}
return ans;
}
int main()
{
Node t;
int i,j;
cin>>n>>m;
for(i = 0;i<m;i++)
{
cin>>t.a>>t.b>>t.w;
nodes.push_back(t);
}
sort(nodes.begin(),nodes.end(),cmp);
cout<<Kruskal();
return 0;
}
/**
4 4
1 2 1
2 3 4
2 4 2
3 4 3
**/