25.最小生成树(kruskal算法)
2016-02-28 22:36
267 查看
时间限制: 1 s
空间限制:
128000 KB
题目等级
: 白银 Silver
题解
查看运行结果
题目描述 Description
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。
约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。
每两个农场间的距离不会超过100000
输入描述 Input
Description
第一行: 农场的个数,N(3<=N<=100)。
第二行..结尾:
接下来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们每行限制在80个字符以内,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为线路从第i个农场到它本身的距离在本题中没有意义。
输出描述 Output
Description
只有一个输出,是连接到每个农场的光纤的最小长度和。
样例输入 Sample
Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样例输出 Sample
Output
28
代码:
#include
#include
#include
using namespace std;
#include
#define maxn 101
#define maxw 100001
int father[maxn],n,t,k=0;
long long tot=0;
struct Edge{
int u,v,w;
};
Edge edge[maxn*maxn];
void input();
void kruskal();
int find(int);
void unionn(int,int);
int main()
{
input();
kruskal();
printf("%lld",tot);
return 0;
}
void input()
{
scanf("%d",&n);
t=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
edge[++t].u=i;
edge[t].v=j;
scanf("%d",&edge[t].w);
}
}
int find(int x)
{
if(father[x]!=x) father[x]=find(father[x]);
return father[x];
}
void unionn(int a,int b)
{
father[b]=a;
}
int cmp(const Edge &a,const Edge &b)
{
return a.w
}
void kruskal()
{
for(int i=1;i<=n;++i)
father[i]=i;
sort(edge+1,edge+1+t,cmp);
for(int i=1;i<=t;++i)
{
int r1=find(edge[i].u);
int r2=find(edge[i].v);
if(r1!=r2)
{
unionn(r1,r2);
tot+=edge[i].w;
k++;
if(k==n-1) return;
}
}
}
空间限制:
128000 KB
题目等级
: 白银 Silver
题解
查看运行结果
题目描述 Description
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。
约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。
每两个农场间的距离不会超过100000
输入描述 Input
Description
第一行: 农场的个数,N(3<=N<=100)。
第二行..结尾:
接下来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们每行限制在80个字符以内,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为线路从第i个农场到它本身的距离在本题中没有意义。
输出描述 Output
Description
只有一个输出,是连接到每个农场的光纤的最小长度和。
样例输入 Sample
Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样例输出 Sample
Output
28
代码:
#include
#include
#include
using namespace std;
#include
#define maxn 101
#define maxw 100001
int father[maxn],n,t,k=0;
long long tot=0;
struct Edge{
int u,v,w;
};
Edge edge[maxn*maxn];
void input();
void kruskal();
int find(int);
void unionn(int,int);
int main()
{
input();
kruskal();
printf("%lld",tot);
return 0;
}
void input()
{
scanf("%d",&n);
t=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
edge[++t].u=i;
edge[t].v=j;
scanf("%d",&edge[t].w);
}
}
int find(int x)
{
if(father[x]!=x) father[x]=find(father[x]);
return father[x];
}
void unionn(int a,int b)
{
father[b]=a;
}
int cmp(const Edge &a,const Edge &b)
{
return a.w
}
void kruskal()
{
for(int i=1;i<=n;++i)
father[i]=i;
sort(edge+1,edge+1+t,cmp);
for(int i=1;i<=t;++i)
{
int r1=find(edge[i].u);
int r2=find(edge[i].v);
if(r1!=r2)
{
unionn(r1,r2);
tot+=edge[i].w;
k++;
if(k==n-1) return;
}
}
}
相关文章推荐
- 灰度值
- 25.最小生成树(kruskal算法)
- 将自己的域名重定向到某网站
- Linux 压缩命令
- SEO基础_审计已有网站_要审计的元素
- Androd自定义控件(一)概述
- ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
- 数据绑定ds.ReadXml(stream);
- Android中如何实现文件下载
- uva10700- Camel trading
- Lowest Common Ancestor
- zookeeper初探(一)
- android studio 5.0以上去除ToolBar而不是ActionBar
- ubuntu 安装完后需要做的事情
- HDU 2066最短路径Dijkstra、
- Linux Curl常用命令使用【转】
- @autowired和@resource的区别(面试题)
- bzoj3110【ZJOI2013】K大数查询
- JavaScript王者归来01
- Linux mysql导入数据库