题意:给坐标系上的一些点,其中有两个点已经连了一条边,求最小生成树的值

将已连接的两点权值置为0,这样一定能加入最小生成树里

最后的结果加上这两点的距离即为所求

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. #include<map>
  8. using namespace std;
  9. #define MOD 1000000007
  10. const int INF=0x3f3f3f3f;
  11. const double eps=1e-;
  12. #define cl(a) memset(a,0,sizeof(a))
  13. #define ts printf("*****\n");
  14. int n,m,tt;
  15. const int MAXN=;//最大点数
  16. const int MAXM=;//最大边数
  17. int F[MAXN];//并查集使用
  18. struct Edge
  19. {
  20. int u,v;
  21. double w;
  22. }edge[MAXM];//存储边的信息,包括起点/终点/权值
  23. int tol;//边数,加边前赋值为0
  24. void addedge(int u,int v,double w)
  25. {
  26. edge[tol].u=u;
  27. edge[tol].v=v;
  28. edge[tol++].w=w;
  29. }
  30. bool cmp(Edge a,Edge b)
  31. {//排序函数,讲边按照权值从小到大排序
  32. return a.w<b.w;
  33. }
  34. int find(int x)
  35. {
  36. if(F[x]==-)return x;
  37. else return F[x]=find(F[x]);
  38. }
  39. double Kruskal(int n)//传入点数,返回最小生成树的权值,如果不连通返回-1
  40. {
  41. memset(F,-,sizeof(F));
  42. sort(edge,edge+tol,cmp);
  43. int cnt=;//计算加入的边数
  44. double ans=;
  45. for(int i=;i<tol;i++)
  46. {
  47. int u=edge[i].u;
  48. int v=edge[i].v;
  49. double w=edge[i].w;
  50. int t1=find(u);
  51. int t2=find(v);
  52. if(t1!=t2)
  53. {
  54. ans+=w;
  55. F[t1]=t2;
  56. cnt++;
  57. }
  58. if(cnt==n-)break;
  59. }
  60. if(cnt<n-)return -;//不连通
  61. else return ans;
  62. }
  63. struct node
  64. {
  65. double x,y;
  66. void in()
  67. {
  68. scanf("%lf%lf",&x,&y);
  69. }
  70. }nn[MAXN];
  71. double dist(node a,node b)
  72. {
  73. return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  74. }
  75. int main()
  76. {
  77. int i,j,k;
  78. #ifndef ONLINE_JUDGE
  79. freopen("1.in","r",stdin);
  80. #endif
  81. while(scanf("%d",&n)!=EOF)
  82. {
  83. tol=;
  84. if(n==) break;
  85. int q,p;
  86. scanf("%d%d",&p,&q);
  87. p--,q--;
  88. for(i=;i<n;i++)
  89. {
  90. nn[i].in();
  91. }
  92. for(i=;i<n;i++)
  93. {
  94. for(j=i+;j<n;j++)
  95. {
  96. addedge(i,j,dist(nn[i],nn[j]));
  97. if((i==p&&j==q)||(i==q&&j==p))
  98. {
  99. addedge(i,j,);
  100. }
  101. }
  102. }
  103. printf("%.2lf\n",Kruskal(n)+dist(nn[p],nn[q]));
  104. }
  105. }

hdu 4463 第37届ACM/ICPC杭州赛区K题 最小生成树的更多相关文章

  1. hdu 4461 第37届ACM/ICPC杭州赛区I题

    题意:给两个人一些棋子,每个棋子有其对应的power,若b没有或者c没有,或者二者都没有,那么他的total power就会减1,total power最少是1,求最后谁能赢 如果b或c出现的话,fl ...

  2. hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs

    题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少? 求最短路的最大距离 #include& ...

  3. hdu 4462 第37届ACM/ICPC 杭州赛区 J题

    题意:有一块n*n的田,田上有一些点可以放置稻草人,再给出一些稻草人,每个稻草人有其覆盖的距离ri,距离为曼哈顿距离,求要覆盖到所有的格子最少需要放置几个稻草人 由于稻草人数量很少,所以状态压缩枚举, ...

  4. Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)

    http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=c ...

  5. hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举

    题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 +  4组 3个相同的牌或者顺子.  只有m.s.p是可以构成顺子的.东西南北这样 ...

  6. hdu 4438 第37届ACM/ICPC 天津赛区现场赛H题

    题意:Alice和Bob两个人去打猎,有两种(只)猎物老虎和狼: 杀死老虎得分x,狼得分y: 如果两个人都选择同样的猎物,则Alice得分的概率是p,则Bob得分的概率是(1-p): 但是Alice事 ...

  7. zoj 3662 第37届ACM/ICPC长春赛区H题(DP)

    题目:给出K个数,使得这K个数的和为N,LCM为M,问有多少种 f[i][j][k]表示选i个数,总和为j,最小公倍数为k memery卡的比较紧,注意不要开太大,按照题目数据开 这种类型的dp也是第 ...

  8. hdu 4432 第37届ACM/ICPC天津现场赛B题

    题目大意就是找出n的约数,然后把约数在m进制下展开,各个数位的每一位平方求和,然后按m进制输出. 模拟即可 #include<cstdio> #include<iostream> ...

  9. hdu 4435 第37届ACM/ICPC天津现场赛E题

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出N个城市,从1开始需要遍历所有点,选择一 ...

随机推荐

  1. Dream------Hadoop--Hadoop HA QJM (Quorum Journal Manager)

    In a typical HA cluster, two separate machines are configured as NameNodes. At any point in time, ex ...

  2. css给表格每一列设置不同的样式

    第一列#id table tr td:first-child{ overflow: visible; }第二列table tr td:first-child+td{color:#666;}第三列tab ...

  3. linux下pip安装无法连接官网

    为了安装pwntools等工具,要先安装pip,系统安装好了,却遇到了无法连接到pip官网的报错,找了半天方法最终解决 wget https://bootstrap.pypa.io/get-pip.p ...

  4. python使用twisted搭建的一个socket服务

    服务端 # -*- coding: utf-8 -*- # @Time : 2018/9/19 21:41 # @Author : cxa # @File : tsTservTW.py # @Soft ...

  5. 01 Go 1.1 Release Notes

    Go 1.1 Release Notes Introduction to Go 1.1 Changes to the language Integer division by zero Surroga ...

  6. C语言基础 - read()函数读取文本字节导致判断失误的问题

    工作了几个月,闲着没事又拿起了经典的C程序设计看了起来,看到字符计数一节时想到用read()去读文本作为字符输入,一切OK,直到行计数时问题出现 了,字符总计数没有问题,可行计算就是进行不了,思考了半 ...

  7. CF1030A 【In Search of an Easy Problem】

    题目巨简单,主要是给大家翻译一下 给n个数,其中存在1就输出HARD,否则输出EASY,不区分大小写 #include<iostream> #include<cstdio> u ...

  8. (四)SpringMvc文件上传

    第一节:SpringMvc单文件上传 第二节:SpringMvc多文件上传

  9. gtk+学习笔记(四)

    今天看了下单选按钮的设置,实现起来还是挺简单的,就是自己太不熟练 radio=gtk_radio_button_new_with_label(NULL,"a"); //第一次创建单 ...

  10. Rookey.Frame企业级快速开发框架开源了

    Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性:应广大网友要 ...