HDU-1875ブロックされていないプロジェクトが続行されます

タイトル:http : //acm.hdu.edu.cn/showproblem.php?pid=1875

分析:クラスカルアルゴリズム。最初に、各島に少なくとも1つの有効なエッジが他の島に接続されていることを確認してから、直接クラスカルに接続します。(しかし、非常に予期しないエラーが発生しました。IDEでC ++ 11を使用すると、魔法のエラーが発生しますが、その後エラーは発生しません。vjudgeでG ++を使用することは可能です)

1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5  名前空間std を使用 6 構造体エッジ
 7 {
 8 int u、v;
9 ダブルw;
10 } e [ 110000 ];
11 構造体ポイント
 12 {
 13 int x、y;
14 } p [ 110 ];
15 int t、n、f [ 110 ]、cnt、tot;
16 ダブルans;
                     17  int find(int k)
 18  {
 19      if(f [k] == k)return k;
20      return f [k] = find(f [k]);
21  }
 22  double cmp(edge a、edge b)
 23  {
 24      return aw < bw;
25  }
 26  double distance(int i、int j)
 27  {
 28      return sqrt((p [i] .xp [j] .x)*(p [i] .xp [j] .x)+(p [i ] .yp [j] .y)*(p [i] .y- p [j] .y));
29  }
 30  無効add(int u、int v、double w)
 31  {
 32      e [++ cnt] .u = u;
33      e [cnt] .v = v;
34      e [cnt] .w = w;
35  }
 36  int main(void 37  {
 38      scanf(" %d "、&t);
39      while(t-- 40      {
 41          tot = cnt = 0 ;
42          ans = 0 ;
43          intb = 0 ;
44          scanf(" %d "、&n);
45          forint i = 1 ; i <= n; i ++ 46          {
 47              scanf(" %d%d "、&​​p [i] .x、&p [i] .y);
48              f [i] = i;
49          }
 50          forint i = 2 ; i <= n; i ++ 51          {
 52              int p = 0 ;
53              のためにint j = 1 ; j <i; j ++ 54              {
 55                  double d = distance(i、j);
56                  if(d <= 1000 && d> = 10 57                  {
 58                      add(i、j、d);
59                      p = 1 ;
60                  }
 61              }
 62              if(p == 0 63              {
 64                  printf(" oh!\ n " );
65                 b = 1 ;
66                  休憩;
67              }
 68          }
 69          if(b == 1継続;
70          sort(e + 1、e + 1 + cnt、cmp);
71          forint i = 1 ; i <= cnt; i ++ 72          {
 73              int fu = find(e [i] .u)、fv = find(e [i] .v);
74              場合(FU == FV)を続けます75              f [fu] = fv;
76             ans + = e [i] .w;
77              if(++ tot == n- 1break ;
78          }
 79          printf(" %.1f \ n "、ans * 100 );
80      }
 81      return  0 ;
82 }

 

おすすめ

転載: www.cnblogs.com/yanying7/p/12738248.html