标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 7469 | Accepted: 3620 |
Description
Input
Output
Sample Input
3 10.000 10.000 50.000 10.000 40.000 10.000 50.000 10.000 40.000 40.000 50.000 10.000 2 30.000 30.000 30.000 20.000 40.000 40.000 40.000 20.000 5 5.729 15.143 3.996 25.837 6.013 14.372 4.818 10.671 80.115 63.292 84.477 15.120 64.095 80.924 70.029 14.881 39.472 85.116 71.369 5.553 0
Sample Output
20.000 0.000 73.834
【分析】一开始Kruskal()里面是这么写的,一直WA;
void Kruskal() { double sum=0; int num=0; int u,v; for(int i=0; i<=cnt; i++) { u=edg[i].u; v=edg[i].v; if(Find(u)!=Find(v)) { sum+=edg[i].w; num++; Union(u,v); } //printf("!!!%d %d\n",num,sum); if(num>=n-1) { printf("%.3lf\n",sum); break; } } }
后来把那个num判断去了就A了,有人知道为什么吗?
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=1005; const int M=15005; struct man { double x,y,z,r;int num; }a[N]; struct Edg { int v,u; double w; } edg[M]; bool cmp(Edg g,Edg h) { return g.w<h.w; } int n,m,maxn,cnt; int parent[N]; void init() { for(int i=0; i<n; i++)parent[i]=i; } void Build() { double w; int u,v; for(int i=0; i<n; i++) { scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z,&a[i].r); a[i].num=i; } for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { u=a[i].num;v=a[j].num; double ss=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].z-a[j].z)*(a[i].z-a[j].z))-a[i].r-a[j].r; edg[++cnt].u=u;edg[cnt].v=v; if(ss>0)edg[cnt].w=ss; else edg[cnt].w=0; } } sort(edg,edg+cnt+1,cmp); } int Find(int x) { if(parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; }//查找并返回节点x所属集合的根节点 void Union(int x,int y) { x = Find(x); y = Find(y); if(x == y) return; parent[y] = x; }//将两个不同集合的元素进行合并 void Kruskal() { double sum=0; int num=0; int u,v; printf("!!!%d\n",cnt); for(int i=0; i<=cnt; i++) { u=edg[i].u; v=edg[i].v; if(Find(u)!=Find(v)) { sum+=edg[i].w; num++; Union(u,v); } //printf("!!!%d %d\n",num,sum); } printf("%.3lf\n",sum); } int main() { while(~scanf("%d",&n)&&n) { cnt=-1; init(); Build(); Kruskal(); } return 0; }
POJ2032 Building a Space Station(Kruskal)(并查集)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5729103.html