UVA - 10397 Connect the Campus kruskal算法

来源:互联网 发布:华育软件骗局 编辑:程序博客网 时间:2024/05/16 07:58

题目大意:要在学校搭建校园网,已经将其中几台机器连接起来了,求将其他机器也用线连接起来,使其生成一棵最小生成树,求用的线的长度

解题思路:kruskal算法的模板题,先将连接起来的机器的点并起来就可以解决了,记得数组开大点

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;#define maxn 755#define maxl 1000010double 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 755double 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;}


0 0
原创粉丝点击