hdu 1875 最小生成树(kruskal)
2014-04-06 11:26
260 查看
/* 题意:中文题 题解:赤裸裸的最小生成树 */ #include <cstdio> #include <cmath> #include <algorithm> const int MAXN = 109; const int MAXE = 10009; struct edge { int u, v; double w; bool vis; }E[MAXE]; int set[MAXN]; int N, EN, sum; void addedge(int u, int v, double w) { E[ EN ].u = u; E[ EN ].v = v; E[ EN ].w = w; E[ EN ].vis = false; EN++; return ; } void init() { for (int i = 1; i <= N; i++) // 树的标号从1开始 set[i] = i; return ; } int find(int x) { while (set[x] != x) x = set[x]; return set[x]; } bool cmp(edge a, edge b) { return a.w < b.w; } double kruskal() { int x, y; double ret; init(); sum = 0; ret = 0; std::sort(E,E+EN,cmp); for (int i = 0; i < EN && sum < N - 1; i++) { x = find( E[i].u ); y = find( E[i].v ); if (x == y) continue; set[x] = set[y]; E[i].vis = true; sum++; ret += E[i].w; } return ret; } struct point { int x,y; }P[MAXN]; int getdisSq(point a, point b) { return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y); } int main(void) { int t; scanf("%d",&t); while (t--) { scanf("%d",&N); for(int i=1; i<=N; i++) scanf("%d%d",&P[i].x,&P[i].y); EN = 0; for(int i=1; i<N; i++) { for(int j=i+1; j<=N; j++) { int tmp = getdisSq(P[i],P[j]); if (100 <= tmp && tmp <= 1000000) addedge(i,j,sqrt(1.0*tmp)); } } double ans = kruskal(); if (sum == N-1) printf("%.1lf\n",100*ans); else printf("oh!\n"); } return 0; }
相关文章推荐
- UML 之 活动图
- Java读取Mdb初试
- Uva 11729 Commando War
- Python随手记
- 我的第一篇博客
- 第4周作业-数学学习工具
- 数字通信基本概念
- POJ 2533 Longest Ordered Subsequence
- 解决laravel中环境配置不起作用的方法
- DataTable删除行(所有的或者有条件的),List删除项参照方法3和4.
- win8 下 eclipse+android 开发环境配置带图详细教程
- linux下编写C++程序
- 开方数
- ubuntu 13.10 64 安装lib32库
- 设计原则
- Launcher2编译
- Ubuntu安装Vmware Tools后hgfs无法看到共享文件的解决方法
- Longest Repeated Sequence
- Hive.GROUPING SETS的“陷阱”
- 免费linux远程服务器主机nitrousIO