Prim!
/*prim題意:給定一些點,一些衛星,一個衛星能串連兩個點,點和點之間通訊有一定的距離限制。問能使得所有的點聯通的最小距離。*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>#include<map>#include<stack>#include<set>#include<math.h>using namespace std;typedef long long int64;//typedef __int64 int64;typedef pair<int64,int64> PII;#define MP(a,b) make_pair((a),(b)) const int maxn = 505;const int inf = 0x7fffffff;const double pi=acos(-1.0);const double eps = 1e-8;struct Node{double x,y;}a[ maxn ];int vis[ maxn ];double dis[ maxn ];double mat[ maxn ][ maxn ];double dist( Node a,Node b ){return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );}void init( int n ){for( int i=1;i<=n;i++ ){for( int j=1;j<=n;j++ ){mat[i][j] = dist( a[i],a[j] );}}return ;} void prim( int n ){for( int i=1;i<=n;i++ ){vis[ i ] = 0;dis[ i ] = mat[1][i];}vis[ 1 ] = 1;for( int i=1;i<=n;i++ ){int M = inf;int id = -1;for( int j=1;j<=n;j++ ){if( vis[ j ]==0&&M>dis[j] ){M = dis[ j ];id = j;}}if( id==-1 ) return ;vis[ id ] = 1;for( int j=1;j<=n;j++ ){if( vis[j]==0&&dis[j]>mat[ id ][ j ] ){dis[ j ] = mat[ id ][ j ];}}}return ;}int main(){int T;scanf("%d",&T);while( T-- ){int s,n;scanf("%d%d",&s,&n);for( int i=1;i<=n;i++ )scanf("%lf%lf",&a[i].x,&a[i].y);init( n );prim( n );sort( dis+1,dis+1+n );//for( int i=1;i<=n;i++ )//printf("%lf ",dis[ i ]);//puts("");printf("%.2lf\n",dis[ n-s+1 ]);}return 0;}