[2016-04-13][POJ][2349][Arctic Network]

  • 时间:2016-04-13 23:52:36 星期三

  • 题目编号:[2016-04-13][POJ][2349][Arctic Network]

  • 题目大意:问最小生成树中,第k大的边是多少

  • 分析:直接kruskal,合并到倒数第k条边即可

  • 遇到的问题:POJ 输出用 %f 而不是 %lf

  1. #include<cstdio>
  2. #include<set>
  3. #include<cmath>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn = 500 + 10;
  7. int fa[maxn];
  8. void ini(int n){
  9. for(int i = 0 ; i <= n ; ++i)
  10. fa[i] = i;
  11. }
  12. int fnd(int x){
  13. return x == fa[x] ? x : fa[x] = fnd(fa[x]);
  14. }
  15. struct Point{
  16. int x,y;
  17. }pp[maxn];
  18. struct Edge{
  19. int u,v,c;
  20. Edge(int a=0,int b=0,int cc=0):u(a),v(b),c(cc){}
  21. bool operator < (const Edge & a)const{
  22. return c < a.c;
  23. }
  24. }e[maxn * maxn];
  25. int dis(int a,int b){
  26. return (pp[a].x - pp[b].x)*(pp[a].x - pp[b].x) + (pp[a].y - pp[b].y)*(pp[a].y - pp[b].y);
  27. }
  28. int main(){
  29. int t;
  30. scanf("%d",&t);
  31. while(t--){
  32. int s,p;
  33. scanf("%d%d",&s,&p);
  34. for(int i = 0 ; i < p;++i){
  35. scanf("%d%d",&pp[i].x,&pp[i].y);
  36. }
  37. ini(p);
  38. int cnt = 0;
  39. for(int i = 0 ; i < p; ++i){
  40. for(int j = 0; j < p ; ++j){
  41. e[cnt++] = Edge(i,j,dis(i,j));
  42. }
  43. }
  44. sort(e,e+cnt);
  45. int k = 0,ans = 0;
  46. for(int i = 0 ; i < cnt; ++i){
  47. int f1 = fnd(e[i].u);
  48. int f2 = fnd(e[i].v);
  49. if(f1 != f2){
  50. fa[f1] = f2;
  51. ++k;
  52. if(k == p - s){
  53. ans = e[i].c;
  54. break;
  55. }
  56. }
  57. if(k == p - 1) break;
  58. }
  59. printf("%.2f\n",sqrt(double(ans)));
  60. }
  61. return 0;
  62. }


来自为知笔记(Wiz)


posted on 2016-04-13 23:56  红洋  阅读(113)  评论(0)    收藏  举报

导航