HDU 1875 畅通工程再续 (最小生成树)
2015-06-03 16:39
387 查看
畅通工程再续
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17913 Accepted Submission(s): 5593
[align=left]Problem Description[/align]
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
[align=left]Input[/align]
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
[align=left]Output[/align]
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
[align=left]Sample Input[/align]
2
2
10 10
20 20
3
1 1
2 2
1000 1000
[align=left]Sample Output[/align]
1414.2
oh!
#include <iostream> #include <cstdio> #include <string> #include <queue> #include <vector> #include <map> #include <algorithm> #include <cstring> #include <cctype> #include <cstdlib> #include <cmath> #include <ctime> using namespace std; const int SIZE = 105; int FATHER[SIZE],N,M,NUM; int MAP[SIZE][SIZE]; struct Node { int from,to; double cost; }G[SIZE * SIZE]; struct { int x,y; }TEMP[SIZE]; void ini(void); int find_father(int); void unite(int,int); bool same(int,int); void kruskal(void); bool comp(const Node &,const Node &); double dis(int,int,int,int); int main(void) { int t; double temp; scanf("%d",&t); while(t --) { scanf("%d",&N); ini(); for(int i = 1;i <= N;i ++) scanf("%d%d",&TEMP[i].x,&TEMP[i].y); for(int i = 1;i <= N;i ++) for(int j = i + 1;j <= N;j ++) { temp = sqrt(dis(TEMP[i].x,TEMP[i].y,TEMP[j].x,TEMP[j].y)); if(temp >= 10 && temp <= 1000) { G[NUM].from = i; G[NUM].to = j; G[NUM].cost = temp * 100; NUM ++; } } sort(G,G + NUM,comp); kruskal(); } return 0; } void ini(void) { NUM = 0; for(int i = 1;i <= N;i ++) FATHER[i] = i; } int find_father(int n) { if(FATHER == n) return n; return FATHER = find_father(FATHER ); } void unite(int x,int y) { x = find_father(x); y = find_father(y); if(x == y) return ; FATHER[x] = y; } bool same(int x,int y) { return find_father(x) == find_father(y); } bool comp(const Node & a,const Node & b) { return a.cost < b.cost; } void kruskal(void) { int count = 0; double ans = 0; for(int i = 0;i < NUM;i ++) if(!same(G[i].from,G[i].to)) { unite(G[i].from,G[i].to); count ++; ans += G[i].cost; if(count == N - 1) break; } if(count == N - 1) printf("%.1f\n",ans); else puts("oh!"); } double dis(int x_1,int y_1,int x_2,int y_2) { return pow(x_1 - x_2,2) + pow(y_1 - y_2,2); }
相关文章推荐
- 苹果应用商店审核指南中文翻译
- Java for LeetCode 138 Copy List with Random Pointer
- 字符串如何判断null.
- hdoj2151简单的计数DP
- 你或许想要用到的三个新的JavaScript API
- android如何在Eclipse无法运行,如何生成apk文件
- 数据包头分析---网络字节序与主机字节序
- 设计模式(四):适配器模式
- HDOJ-3788 ZOJ问题(递推)
- WebSocket 协议
- PLSQL中文插入乱码问题解决方法
- 向数据库中存储以及读取BLOB对象
- 畅通工程(1863)
- 如何调用Makefile , enter to directory A and B,then make them
- C++ string 用法详解(内部实现)
- android 多个Icon启动多个入口Activity
- auto_ptr和shared_ptr
- Xcode提交代码到github
- Mob第三方分享到QQ空间、新浪微博等
- 每日一题G 2015/6/3 16:38