ブルーブリッジカップに関する以前の質問(2014)REV-22キングの問題

質問を注意深く調べてください。この質問は使用およびチェックされます...理由を聞かないでください...

問題の説明

  C国はn個の島で構成されています。島間の通信を容易にするために、C国は2つの島を接続するm個の橋を島間に構築しています。2つの島の間に複数の橋がある場合があります。ただし、海水の浸食により、一部の橋梁は使用できなくなる恐れがあります。
  2つの島の間のすべてのブリッジを使用できない場合、2つの島に直接到達することはできません。ただし、これらの2つの島の居住者が他の橋または他の島を介して互いに到達できる限り、それらは問題ありません。しかし、到着の前日と翌日の2つの島に到達する方法があった場合、住民は一緒に抗議しました。
  現在、国Cの王は、各橋が使用できる日数をすでに知っており、この日数を超えると使用できなくなります。今、彼は住民が抗議する日数を知りたいです。

入力フォーマット

  入力の最初の行には、アイランドの数とブリッジの数を表す2つの整数n、mが含まれています。
  次のm行で、各行の3つの整数a、b、およびtは、ブリッジが2つの島aおよびbを接続し、t日間使用できることを示しています。島の数は1から増加します。

出力フォーマット

  住民が抗議する日数を示す整数が出力されます。

入力例

4 4
1 2 2
1 3 2
2 3 1
3 4 3

出力例

2

サンプルの説明

  2と3の間の橋は、初日以降は使用できず、影響を受けません。
  1〜2、1〜3の橋は翌日以降は使用できず、住民が抗議します。
  3日目と4日目の架け橋は3日目以降は使用できず、住民が抗議します。

データサイズと合意

  データの30%の場合、1 <= n <= 20、1 <= m <= 100
  、データの50%の場合、1 <= n <= 500、1 <= m <= 10000
  、データの100% 1 <= n <= 10000、1 <= m <= 100000、1 <= a、b <= n、1 <= t <= 100000。

1 #include <iostream>
 2 #include <algorithm>
 3  名前空間std を使用 4 int n、m;
5 int father [ 10000 + 5 ];
6 struct bridge {
 7 int sta;
8 int endd;
9 int ;
10 } bri [ 100000 + 5 ];
11 int cmp(bridge a、bridge b){
 12 return at> bt;
13 }
 14 void セット                           (){ // 親ノードの初期化(最初の親ノードはそれ自体)
15      forint i = 1 ; i <= n; i ++ ){
 16          father [i] = i;
 17      }
 18      return ;
 19  }
 20  / / チェックセット
21  int find(int a){ // 再帰的にルートノードを検索
22      if(father [a] == a)// 親ノード自体がルートノードであるノード
23          return a;
 24      return find(father [ a]);
 25  }
 26  int unionbridge(inta、int b){ // 同じツリーかどうかを判断します。実際には、2つのポイントが直接(間接的に)
27      int fa = find(a);
 28      int fb = find(b );
 29      if(fa!= Fb){ // 同じルートノードではないツリーをマージする、つまり到達できない状況
30          father [fa] = fb;
 31          return  1 ;
 32      }
 33      return  0 ; // 直接できる(間接的に)リーチ
34  }
 35  
36   
37  int main(){
 38      cin >> n >> m;
 39      int num = m;
40      int a、b、t;
41      int i = 1 ;
42      while(num-- ){
 43          cin >> a >> b >> t;
44          bri [i] .sta = a;
45          bri [i] .endd = b;
46          bri [i] .t = t;
47          i ++ ;
48      }
 49      int pre = -1 ;
50      int ans = 0 ;
51      ソート(bri + 1、bri + m + 1 、cmp); 
52      セット();
53      forint i = 1 ; i <= m; i ++ ){
 54          if(unionbridge(bri [i] .sta、bri [i] .endd)&& pre!= Bri [i] .t){ // 判断は事故はなく、トラブルの日数を記録し
ます55              ans ++ ;
 56              pre = bri [i] .t;
 57          }
 58      }
 59      cout << ans << endl;
 60      
61      
62 }

おすすめ

転載: www.cnblogs.com/memocean/p/12723376.html