Uva(10034)
这题是要你求讲所有点连起来的最小的代价是多少。连起两点的代价是两个点之间的距离。。。最基本的最小生成树
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=200; int u[maxn*maxn],v[maxn*maxn]; double dis[maxn*maxn]; double x[maxn*maxn],y[maxn*maxn]; int p[maxn*maxn]; int r[maxn*maxn]; int n; void init() { for(int i=1;i<=n;i++) p[i]=i; } bool cmp(int i,int j) { return dis[i]<dis[j]; } double disd(double a,double b,double c,double d) { return sqrt(pow(a-c,2.0)+pow(b-d,2.0)); } int find(int x) { return p[x]==x?x:find(p[x]); } double kua(int n) { double ans=0; init(); for(int i=0;i<n;i++) r[i]=i; sort(r,r+n,cmp); for(int i=0;i<n;i++) { int w=r[i]; int x=find(u[w]); int y=find(v[w]); if(x!=y) { ans+=dis[w]; p[x]=y; } } return ans; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf %lf",&x[i],&y[i]); int k=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { double len=disd(x[i],y[i],x[j],y[j]); dis[k]=len; u[k]=i; v[k]=j; k++; } } double ans=kua(k); printf("%0.2lf\n",ans); if(t) printf("\n"); } return 0; }