引き続き、過去問を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 <=?????????