您的位置:首页 > 其它

最小生成树(kruskal)

2015-10-04 23:46 351 查看
先来前排卖个瓜子,推荐个oj:一个神奇的oj

http://oj.fjaxyz.com:3389/problem.php?id=69

题目描述

假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。

这时, 如何在最节省经费的前提下建立这个通信网。

在每两个城市之间都可以设置—条线路,相应地都要付出一定的经济代价。

n个城市之间,最多可能设置n(n- 1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?

这题是裸的最小生成树,何为最小生成树?就是一张图,n个点,n-1条边,且边上的权值加起来还要最小

这题的样例图如下

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int f[300];
struct graph
{
int from,to,dis;
}a[45000];
bool cmp(graph x,graph y)
{
return x.dis<y.dis;
}
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
int n,b,k=1,i,j,x,y,ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&b);
if(j<=i || b==-1)
continue;
a[k].from=i;
a[k].to=j;
a[k++].dis=b;
}
}
sort(a+1,a+k,cmp);
for(i=1;i<k;i++)
{
x=find(a[i].from);
y=find(a[i].to);
if(x!=y)
{
ans+=a[i].dis;
f[y]=x;
}
}
printf("%d\n",ans);
return 0;
}


69 通信线路
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: