题目大意:要在学校搭建校园网,已经将其中几台机器连接起来了,求将其他机器也用线连接起来,使其生成一棵最小生成树,求用的线的长度
解题思路:kruskal算法的模板题,先将连接起来的机器的点并起来就可以解决了,记得数组开大点
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 755
#define maxl 1000010
double x[maxn],y[maxn];
double len[maxl];
int r[maxl];
int p[maxn],u[maxl],v[maxl];
int find(int x) {
return x == p[x] ? x: p[x] = find(p[x]);
}
int cmp( const int i, const int j ) {
return len[i] < len[j];
}
int main() {
int n,m;
while(scanf("%d",&n) != EOF) {
int N = 0;
for(int i = 0; i < n; i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++) {
u[N] = i;
v[N] = j;
len[N] = sqrt( (x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
N++;
}
for(int i = 0; i < N; i++)
r[i] = i;
for(int i = 0; i < n; i++)
p[i] = i;
sort(r,r+N,cmp);
scanf("%d",&m);
int t1,t2;
for(int i = 0 ; i < m; i++) {
scanf("%d%d",&t1,&t2);
int a = find(t1-1);
int b = find(t2-1);
if(a != b)
p[a] = b;
}
double ans = 0;
for(int i = 0 ; i < N ; i++) {
int e = r[i];
int a = find(u[e]);
int b = find(v[e]);
if(a != b) {
p[a] = b;
ans += len[e];
}
}
printf("%.2lf\n",ans);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 755
double x[maxn],y[maxn];
double len[1000000];
int r[1000000];
int p[maxn];
int find(int x) {
return x == p[x] ? x: p[x] = find(p[x]);
}
int cmp( const int i, const int j ) {
return len[i] < len[j];
}
int main() {
int n,m;
while(scanf("%d",&n) != EOF) {
for(int i = 0; i <= n; i++) {
p[i] = i;
r[i] = i;
}
for(int i = n ; i <= n *n; i++)
r[i] = i;
for(int i = 0; i < n; i++)
scanf("%lf%lf",&x[i],&y[i]);
scanf("%d",&m);
int t1,t2;
for(int i = 0 ; i < m; i++) {
scanf("%d%d",&t1,&t2);
int a = find(t1-1);
int b = find(t2-1);
if(a != b)
p[a] = b;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
len[i*n+j] = sqrt( (x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
sort(r,r+(n-1)*(n-1),cmp);
double ans = 0;
int end = (n-1) * (n -1);
for(int i = 0 ; i <= end ; i++) {
int a = find(r[i]/n);
int b = find(r[i]%n);
if(a != b) {
p[a] = b;
ans += len[r[i]];
}
}
printf("%.2lf\n",ans);
}
return 0;
}