UVa10034 Freckles

来源:互联网 发布:道德经知其雄 守其雌 编辑:程序博客网 时间:2024/06/03 06:32

题意:平面内有n个点,求最小生成树。

思路:就是最小生成树。。prim算法。不过我连图都没建,因为每两个点之间都是连通的,需要的时候算一下长度就好了。


#include <iostream>#include <stdio.h>#include <cmath>#include <algorithm>#include <iomanip>#include <cstdlib>#include <string>#include <memory.h>#include <vector>#include <queue>#include <stack>#include <ctype.h>using namespace std;struct point{double x;double y;};point pt[110]; double dis[110];bool vis[110];double dist(point p1,point p2){return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}int main(){int t;cin>>t;while(t--){memset(vis,0,sizeof(vis));int n;cin>>n;for(int i=1;i<=n;i++){cin>>pt[i].x>>pt[i].y;}for(int i=1;i<=n;i++){dis[i]=dist(pt[1],pt[i]);}vis[1]=true;double ans=0.0;for(int k=1;k<n;k++){double tmp=99999.9;int key;for(int i=1;i<=n;i++){if(vis[i])continue;if(dis[i]<tmp){tmp=dis[i];key=i;}}ans+=dis[key];vis[key]=true;for(int i=1;i<=n;i++){if(dist(pt[key],pt[i])<dis[i]){dis[i]=dist(pt[key],pt[i]);}}}printf("%.2lf\n",ans);if(t)cout<<endl;} return 0;}


0 0