[AtCoder]ABC B061 – Counting Roads[C++]

プログラミング

引き続き、過去問をC++でB問題を解いていきます。

ABC B061 – Counting Roads

問題

N個の都市があり、M本の道路があります。
i(1≦i≦M)番目の道路は、都市aiと都市bi(1≦ai,bi≦N)を双方向に結んでいます。
同じ2つの都市を結ぶ道路は、1本とは限りません。
各都市から他の都市に向けて、何本の道路が伸びているか求めてください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main () {
  int N, M;
  cin >> N >> M;

  int road[N];
  // 配列の初期化
  for(int i = 0; i < N; i++){
    road[i] = 0;
  }
 
  for(int i = 0; i < M; i++){
    int a, b;
    cin >> a >> b;
    road[a - 1] += 1;
    road[b - 1] += 1;
  }

  for(int i = 0; i < N; i++){
    cout << road[i] << endl;
  }
}

道路の本数を格納する為の配列roadを用意します。
入力されたa,bに道路が伸びているので、配列roadのa-1番目とb-1番目に1を加えていけば、道路の本数がわかりますね。

配列の初期化
この問題から学んだのは配列の初期化です。
8行目で配列を宣言しているのですが、何もしなければ、初期値は0がセットされると思っていたのですが、そうではないようです。初耳です(いまさら?)。変数の場合も同じです。
なので、9行目で初期値0をセットしています。
翔泳社の独習C++ 新版によると、C++では初期値を設定しないことで、プログラムの速度を突き詰めているそうです。

N=5とした時
#include <bits/stdc++.h>
using namespace std;
int main () {
  int N, M;
  cin >> N >> M;

  int road[N];
  for(int i = 0; i < N; i++){
    cout << road[i] << endl;
  }
}

出力
=> 0
=> 0
=> 0
=> 0
=> 711279696   <=?????????
タイトルとURLをコピーしました