最小生成树 poj2349

来源:互联网 发布:陕西广电网络员工待遇 编辑:程序博客网 时间:2024/05/17 03:54

题目来源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;}


 

原创粉丝点击