【luogu题解】P1546 最短网络 Agri-Net

  • 题目

  约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。

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

  • 输入

  第一行: 农场的个数,N(3<=N<=100)。

  第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

  • 输出

  只有一个输出,其中包含连接到每个农场的光纤的最小长度。

  • 思路

  我是用并查集加上贪心过的这道题( 本来题目就不是很难 ),其中值得注意的地方是由于输入的矩阵是关于对角线对称的,所以只用读入一半就好了。

实现代码

 #include <cstdio>
#include <algorithm> using namespace std; const int maxn = ; struct node {
int st, ed, v;
};
node a[maxn]; int f[maxn]; bool cmp ( node a, node b) {
return a.v < b.v;
} int find ( int k ) {
if ( k == f[k] ) return k;
else {
f[k] = find( f[k] );
return f[k];
}
} int main () {
int n, index = ;
scanf ( "%d", &n );
for ( int i = ; i <= n; i ++ ) {
for ( int j = ; j <= n; j ++ ) {
int k;
scanf ( "%d", &k );
if ( j > i ) {
index ++;
a[index].st = i; a[index].ed = j; a[index].v = k;
}
}
}
for ( int i = ; i <= n; i ++ ) f[i] = i;
sort ( a + , a + index + , cmp );
int ans = , p = ;
for ( int i = ; i <= index; i ++ ) {
if ( find( a[i].st ) != find( a[i].ed ) ) {
ans += a[i].v;
f[find( a[i].st )] = a[i].ed;
p ++;
if ( p == n ) break;
}
}
printf ( "%d", &ans );
return ;
}
上一篇:洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)


下一篇:Sql group by 分组取时间最新的一条数据