好久没有写过最小生成树的题了,碰到一道最小生成树的题,没想到竟然1A了,,,happy。用的是kruskal算法,比较简单的。题目:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5046 | Accepted: 2630 |
Description
Input
Output
Sample Input
3 1.0 1.0 2.0 2.0 2.0 4.0
Sample Output
3.41ac代码:
#include <iostream> #include <string.h> #include <cmath> #include <algorithm> using namespace std; const int N=110; int father[N]; int n,k; struct point{ double x,y; }pp[N]; struct edge{ int lp,rp; double len; }ee[N*N]; double fun(double x){ return x*x; } void init(){ for(int i=1;i<=n;++i) father[i]=i; k=0; for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ if(i==j)continue; ee[k].lp=i; ee[k].rp=j; ee[k++].len=sqrt( fun(pp[i].x-pp[j].x)+fun(pp[i].y-pp[j].y) ); } } } bool cmp(edge a,edge b){ return a.len<b.len; } int find(int x){ if(x!=father[x]) father[x]=find(father[x]); return father[x]; } bool Union_Set(int x,int y){ int rootx=find(x); int rooty=find(y); if(rootx!=rooty){ father[rooty]=rootx; return true; } return false; } int main(){ //freopen("1.txt","r",stdin); while(~scanf("%d",&n)){ for(int i=1;i<=n;++i) scanf("%lf%lf",&pp[i].x,&pp[i].y); init(); sort(ee,ee+k,cmp); double sum=0.0; for(int i=0;i<k;++i){ int x=ee[i].lp; int y=ee[i].rp; bool flag=Union_Set(x,y); if(flag)sum+=ee[i].len; } printf("%.2lf\n",sum); } return 0; }