counting roadsの問題を解くためのメモ
counting roadsという問題の概要
N個の都市があり、M本の道路があり、それぞれの都市について、都市と都市をつなぐ道路が何本あるか数える問題。
N = 4、M = 3のとき
入力
4 3
1 2
2 3
1 4
出力
2
2
1
1
都市が4個、道路が3本、都市と都市を2列で表現し、隣り合う都市に道路がつながっていると考える。
都市は4個なので、都市1、都市2、都市3、都市4を2列で入力することになる。
道路は3本なので、3行で4つの都市を上記のように入力する。
出力は、都市1とつながっている道路は何本あるか、都市2とつながっている道路は何本あるか、…という感じでカウントするので、結局、入力した2列の都市のそれぞれの都市の数をカウントすること=それぞれの都市がつながっている道路の本数なので、
入力した都市を数える処理を行う。
1.入力を受け取る
縦方向がM行、横方向は常に2列なので2列の2次元配列として受け取る。vectorの2次元配列にする。
2.vectorの2次元配列に受け取った都市1~都市N個を都市ごとにカウントする。
3.カウントした値を出力する。
#include <bits/stdc++.h>
using namespace std;
int main() {
int N, M;
int k = 1;
int count = 0;
cout << "N,Mを入力してください" << endl;
cin >> N >> M;
vector<vector<int>> data(M, vector<int>(2));
// 入力
for(int i = 0; i < M; i++){
for(int j = 0; j < 2; j++){
// cinで入力をvector配列に代入
cin >> data.at(i).at(j);
}
}
// dataに入った要素の各数値をカウントし出力
while(k <= N){
for(int i = 0; i < M; i++){
for(int j = 0; j < 2; j++){
if(data.at(i).at(j) == k){
count++;
} else {
continue;
}
}
}
cout << "N= " << k << "カウント値は " << count << " です。" << endl;
count = 0;
k++;
}
return 0;
}
vectorの2次元配列にいれたデータのカウントが難しく感じました。
普通にfor文を2重でループするだけでは、vectorの要素を1周してループを抜けてしまうので、カウント処理が難しい。
そこで、思いついたのが、for文をwhileでくくって、Nの各値をkとする。
for文の2重ループを抜ける=vectorの要素全てを一通り1回ループする
なので、2重ループの中でvectorの要素がk=1でないかを判定し、1ならカウンタを増やす。2重ループを抜けたらvectorの要素が1のカウント値を出力して、kを+1インクリメントしてまたfor文の2重ループに入り、今度はvectorの要素がk=2かどうかを判定しカウントする処理をする。k=Nになるまでwhileによって繰り返す。という処理にしました。
この記事が気に入ったらサポートをしてみませんか?