Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 16968 | Accepted: 5412 |
Description
Input
Output
Sample Input
1 2 4 0 100 0 300 0 600 150 750
Sample Output
212.13
Source
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=2005; const int M=15005; double edg[N][N]; double lowcost[N];//记录未加入树集合的i离树集合中元素最小的距离 int n,m,t,v; double d[N]; bool cmp(double a,double b){ return a<b; } struct man { double x,y;int num; }a[N]; double fun(man a,man b) { double cnt=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); return cnt; } void Build() { for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { edg[i][j]=edg[j][i]=fun(a[i],a[j]); } } } void prim() { double sum=0;lowcost[0]=-1; for(int i=1;i<n;i++){ lowcost[i]=edg[0][i]; } for(int i=1;i<n;i++){ double minn=inf;int k; for(int j=0;j<n;j++){ if(lowcost[j]!=-1&&lowcost[j]<minn){ k=j;minn=lowcost[j]; } } sum+=minn; d[v++]=minn; lowcost[k]=-1; for(int j=0;j<n;j++){ lowcost[j]=min(lowcost[j],edg[k][j]); } } sort(d,d+v,cmp); printf("%.2lf\n",d[n-m-1]); } int main() { scanf("%d",&t); while(t--) { memset(edg,0,sizeof(edg)); memset(lowcost,0,sizeof(lowcost)); memset(d,0,sizeof(d)); v=0; scanf("%d%d",&m,&n); for(int i=0;i<n;i++){ scanf("%lf%lf",&a[i].x,&a[i].y); a[i].num=i; } Build(); prim(); } return 0; }
原文:http://www.cnblogs.com/jianrenfang/p/5730404.html