题目来源http://poj.org/problem?id=2349
我不得不说我要凌乱啦!
我从一开始都是对大致题意明白但是对一些小细节很不明白,包括现在!那个P给的是卫星频道数,但是为什么要求的是第p个长的边而不是第P+1个边,能过完全是靠给的测试实例然后猜的,真是越来越乱啦!
看题就知道这道题可以用的是最小生成数,因为点比较密集,所以采用的是Prime算法!
AC的算法:
#include<iostream> #include<cmath> using namespace std; int Max=888888; double tree[505][505]; double array[505]; bool vis[505]; typedef struct fun { double x,y; }rr; fun a[505]; void prim(int n) { vis[0]=true; int i,j,k,l=0; double low[505]; for(i=1; i<n; i++) low[i]=tree[0][i]; for(i=1; i<=n-1; i++) { double min=Max; j=0; for(k=1; k<n; k++) if(low[k]<min && vis[k]==false)//每一次记录的都是最小的啊 { min=low[k]; j=k; } array[l++]=min; vis[j]=true; for(k=1; k<n; k++) if(tree[j][k]<low[k] && vis[k]==false) low[k]=tree[j][k]; } } int cmp(const void *a,const void *b) { return *(double *)a>*(double *)b?-1:1; } int main() { int T,p,n,i,j; cin>>T; while(T--) { cin>>p>>n; for(i=0; i<n; i++) for(j=0; j<n; j++) tree[i][j]=Max; for(i=0; i<n; i++) { cin>>a[i].x>>a[i].y; vis[i]=false; } //建立树的 for(i=0; i<n; i++) { for(j=i+1; j<n; j++) tree[i][j]=tree[j][i]=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)); } prim(n); qsort(array,n,sizeof(double),cmp); printf("%.2lf\n",array[p-1]); } return 0; }
接下来的是我经常用的那个最慢的Prime算法,是O(n^3),是刚学算法是自己想的,虽然这道题的数据不多,但是还是超时拉!
#include<iostream> #include<cmath> using namespace std; typedef struct fun { int x,y; }rr; fun a[505]; bool vis[505]; int b[505]; int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } int main() { int i,j,T,p,t; cin>>T; while(T--) { cin>>p>>t; for(i=0; i<t; i++) { // getchar();getchar(); cin>>a[i].x>>a[i].y; vis[i]=false; } vis[0]=true; int jilu,n,max; n=0; while(1) { max=1000000000; for(i=0; i<t; i++) { if(vis[i]==false) continue; for(j=0; j<t; j++) { if(vis[j]==true || j==i) continue; if((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y)<max) { max=(a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y); jilu=j; } } } vis[jilu]=true; b[n++]=max; b[n]=0; if(n==t-1) break; } qsort(b,t-1,sizeof(int),cmp); double m=sqrt((double)b[p-1]); printf("%.2lf\n",m); } return 0; }