题目链接在这里
题目描述:
John要给村民通宽带!他现在已经有了一个高速网络了,现在想将村民相互连接起来。现给出村民之间的距离,求将他们连接起来的最小花费为多少。
思路分析:
最小生成树,盘它就完事了。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int MaxN = 110;
struct Edge{
int x, y, val;
bool operator < (const Edge &e) const{
return val > e.val;
}
};
int n;
int par[MaxN], r[MaxN];
void init(){
for(int i = 0; i < MaxN; ++i)
par[i] = i;
memset(r, 0, sizeof(r));
}
int Find(int x){
if(x == par[x]) return x;
return par[x] = Find(par[x]);
}
void unite(int x, int y){
x = Find(x);
y = Find(y);
if(x == y) return;
if(r[x] < r[y]) par[x] = y;
else{
par[y] = x;
if(r[x] == r[y]) ++r[x];
}
}
bool check(int x, int y){
return Find(x) == Find(y);
}
int main(){
while(~scanf("%d", &n)){
priority_queue<Edge> que;
init();
int w;
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
scanf("%d", &w);
if(i < j){
que.push(Edge{i, j, w});
}
}
}
int ans = 0;
while(--n){
Edge e = que.top();
que.pop();
if(check(e.x, e.y)){
++n;
continue;
}
ans += e.val;
unite(e.x, e.y);
}
printf("%d\n", ans);
}
return 0;
}