您的位置:首页 > 其它

codevs 2627_村村通_最小生成树

2017-01-18 17:54 393 查看

题目描述

你将得到一份各农场之间连接费用的列表(邻接矩阵),你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000

思路

一个最小生成树,然后怕超时用了一下并查集优化的克鲁斯卡尔

然后数组开太大暴了一次

O(n log n)

#include <stdio.h>
#include <algorithm>
using namespace std;
int f[10000],b[1000][1000];
struct arr
{
int x,y,z;
};
arr a[10000];
int cam(arr x,arr y)
{
return x.z<y.z;
}
int find(int x)
{
if (!f[x]) return x;
f[x]=find(f[x]);
return f[x];
}

4000
int insert(int x,int y)
{
if (find(x)!=find(y))
{
f[find(x)]=find(y);
return 1;
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&b[i][j]);
int k=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&b[i][j]!=0)
{
k++;
a[k].x=i;
a[k].y=j;
a[k].z=b[i][j];
}
sort(a+1,a+k+1,cam);
int tot=0;
for (int i=1;i<=k;i++)
{
if (find(a[i].x)!=find(a[i].y))
{
tot+=a[i].z;
insert(a[i].x,a[i].y);
}
}
printf("%d\n",tot);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: