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