博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 10034 - Freckles
阅读量:6194 次
发布时间:2019-06-21

本文共 2258 字,大约阅读时间需要 7 分钟。

  题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和。

  最小生成树问题,用Kruskal算法进行求解,其中用到了并查集。将所有的点连接,构成一张图,对每一条边进行编号,两点间的距离作为权重。

1 #include 
2 #include
3 #include
4 #define square(x) (x)*(x) 5 #define MAXN 10000 6 #define POINTN 100+10 7 using namespace std; 8 9 double w[MAXN], point[POINTN][2]; // the weight of edge10 int u[MAXN], v[MAXN], r[MAXN], p[MAXN]; 11 // u[i] and v[i] save the end points of the ith edge seperately, r[i] save the ith edge of non-decreasing ordered edges12 13 double distance(double x1, double y1, double x2, double y2)14 {15 double t = square(x2-x1) + square(y2-y1);16 return sqrt(t);17 }18 19 int cmp(const int i, const int j)20 {21 return w[i] < w[j];22 }23 24 int find(int x)25 {26 return p[x] == x ? x : p[x] = find(p[x]);27 }28 29 int main()30 {31 #ifdef LOCAL32 freopen("in", "r", stdin);33 #endif34 int N;35 scanf("%d", &N);36 bool first = true;37 while (N--)38 {39 int n;40 scanf("%d", &n);41 for (int i = 0; i < n; i++)42 scanf("%lf%lf", &point[i][0], &point[i][1]);43 int k = 0; // the size of edge44 for (int i = 0; i < n; i++)45 for (int j = i+1; j < n; j++)46 {47 w[k] = distance(point[i][0], point[i][1], point[j][0], point[j][1]);48 u[k] = i;49 v[k] = j;50 k++;51 }52 double ans = 0;53 for (int i = 0; i < n; i++) p[i] = i;54 for (int i = 0; i < k; i++) r[i] = i;55 sort(r, r+k, cmp); // sort the edge56 for (int i = 0; i < k; i++)57 {58 int e = r[i];59 int x = find(u[e]);60 int y = find(v[e]);61 if (x != y)62 {63 ans += w[e];64 p[x] = y;65 }66 }67 if (first) first = false;68 else printf("\n");69 printf("%.2lf\n", ans);70 }71 return 0;72 }
View Code

  代码中用到了间接排序——排序的关键字是对象的“代号”,而不是对象本身,将排序后第i小的边的序号保存在r[i]中。这样对象本身的数据就不需要移动了,比如这道题的u[i]和v[i],自己也就能理解到这点了...代码是照抄别人的,解释还是照抄别人的...人工版的Ctrl-C & Ctrl-V 啊...

转载于:https://www.cnblogs.com/xiaobaibuhei/p/3188700.html

你可能感兴趣的文章
匿名函数的代码模式
查看>>
swat主流域文件(file.cio)参数详解——引自http://blog.sciencenet.cn/blog-922140-710636.html...
查看>>
马云成功的九大秘籍--这个真的值得学学!
查看>>
IE6不支持CSS的属性选择器
查看>>
怎么让一个div 悬浮在另一个div上
查看>>
回溯法 子集树和排序树
查看>>
根级别上的数据无效。 行 1,位置 1
查看>>
[Unity2D]实现背景的移动
查看>>
5天学会jaxws-webservice编程第一天
查看>>
不常用但很有用的git show 和 git blame
查看>>
SQLLoader2(导入EXCEL或csv格式的文件)
查看>>
微信公众平台开发(105) 分享到朋友圈和发送给好友
查看>>
[Leetcode] Regular Expression Matching
查看>>
sublime配置全攻略
查看>>
移动互联网实战--wifi定位和架构
查看>>
WorldWind源码剖析系列:数学引擎类MathEngine
查看>>
初学Flask(1)
查看>>
java基础复习 - 自动装箱
查看>>
Java 注解
查看>>
C++中无法解析的外部符号错误
查看>>