LoginSignup
svsv
@svsv

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

配列の要素の管理がうまくいかない(C++)

Q&AClosed

解決したいこと

https://atcoder.jp/contests/adt_easy_20240620_3/tasks/abc225_b
このリンク先のatcoderの問題についてです。
この問題に対し、一番下に示すコードを書きました。ただし次に示すように適切な結果が得られません。

得られる入力と出力

5
1 4
2 4
3 4
4 5
No

得たい入力と出力

5
1 4
2 4
3 4
4 5
Yes

そこで

cout << link[a][b] <<"  " << link[b][a] << endl;

を追加し適切に各頂点間の辺の数が追加されているかを確認したところ、入出力が下のようになり、加算されていないことが分かりました(スペースが広いほうがcout~による出力です)。

現在のコードで得られる入出力

5
1 4
1  1
2 4
1  1
3 4
1  1
4 5
1  1
No

どこが問題なのかを教えていただきたいです。

作成したコード

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); ++i)

int main() {
  int N,a,b;
  cin >> N; // 頂点数

  vector<vector<int>> link(N, vector<int>(N, 0));

  rep(i,N-1) {//辺の数はN-1個
    cin >> a >> b;//頂点a,b間

    a--; b--;//頂点1~Nを頂点0~N-1にずらす
    link[a][b]++;
    link[b][a]++;
    cout << link[a][b] <<"  " << link[b][a] << endl;
    if ((link[a][b] == N - 1) || (link[b][a] == N - 1)) {
      cout << "Yes" << endl;
      return 0;
    }
  }

  cout << "No" << endl;
  return 0;
}

次の様に修正し、通りました。

修正したコード

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); ++i)

int main() {
  int N,a,b;
  cin >> N; // 頂点数

  vector<int> link(N-1);
  rep(i,N-1) {//辺の数はN-1個
    cin >> a >> b;//頂点a,b間
    a--; b--;//頂点1~Nを頂点0~N-1にずらす
    link[a]++;
    link[b]++;
    if ((link[a] == N - 1) || (link[b] == N - 1)) {
      cout << "Yes" << endl;
      return 0;
    }
  }

  cout << "No" << endl;
  return 0;
}
0

1Answer

どうみても、link[x][y]==1にしか、なりませんよね。
行、または、列の合計がN-1か、と判定しないと。。。

0Like

Comments

  1. @svsv

    Questioner

    やっと理解しました、自分がアホすぎて面白いです。

  2. よろしければ、うまく動くコードを質問欄に追加してもらえるといいかも。

    解決であれば、当Q&Aをクローズしてください。

Your answer might help someone💌