2020/9/26に行われたatcoderのACL問題なのですが、リンク内容
このC問題をAOJのリンク内容を参考にして以下のコードで解いたのですが、いくつかのケースでWAになってしまいます。どこが悪いのか教えていただけますか。
C++
1#include <iostream> 2#include <vector> 3 4using namespace std; 5 6class DisjointSet{ 7 public: 8 vector<int> rank, p; 9 DisjointSet(){} 10 DisjointSet(int size){ 11 rank.resize(size, 0); 12 p.resize(size, 0); 13 for(int i = 1; i < size; i++){ 14 p[i] = i; 15 rank[i] = 0; 16 } 17 } 18 19 void unite(int x, int y){ 20 link(findSet(x), findSet(y)); 21 } 22 23 void link(int x, int y){ 24 if(rank[x] > rank[y]){ 25 p[y] = x; 26 }else{ 27 p[x] = y; 28 if(rank[x] == rank[y]){ 29 rank[y]++; 30 } 31 } 32 } 33 34 int findSet(int x){ 35 if(x != p[x]){ 36 p[x] = findSet(p[x]); 37 } 38 return p[x]; 39 } 40}; 41 42int main() 43{ 44 int n, a, b, m; 45 int cnt = 0; 46 cin >> n >> m; 47 DisjointSet ds = DisjointSet(n + 1); 48 for(int i = 0; i < m; i++){ 49 cin >> a >> b; 50 ds.unite(a, b); 51 } 52 int x; 53 for(int i = 2; i <= n; i++){ 54 if(ds.p[1] != ds.p[i]){ 55 ds.unite(i, 1); 56 cnt++; 57 } 58 } 59 60 cout << cnt << endl; 61 return 0; 62 63}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/26 15:04 編集
2020/09/26 15:47
2020/09/27 01:52