Programming 기초/Coding Test
[c++ 백준 2606 ] 인접리스트, 인접행렬 풀이
코딩상륙작전
2024. 9. 29. 19:47
인접행렬 풀이
#include <iostream>
#include <vector>
using namespace std;
void dfs(vector<vector<int>> &v, const int N, const int node, vector<int> &visited){
if (!visited[node]) visited[node] = 1;
else return;
for (int i = 1; i < N+1; ++i)
if (v[node][i])
dfs(v, N, i, visited);
}
int main(int argc, char **argv){
ios::sync_with_stdio(false);
cin.tie(NULL);
int N, M, s, e;
cin >> N >> M;
vector<int> visited(N+1);
vector<vector<int>> v(N+1, vector<int>(N+1,0)); // 인접행렬
for (int i = 0 ; i < M; ++i){
cin >> s >> e;
v[s][e] = 1;
v[e][s] = 1;
}
dfs(v, N, 1, visited);
int cnt = 0;
for (int i = 0; i < N+1; ++i){
if (visited[i]) ++cnt;
}
cout << cnt-1;
return 0;
}
인접리스트 풀이
#include <iostream>
#include <vector>
using namespace std;
void dfs(vector<int> v[], const int N, const int node, vector<int> &visited){
if (!visited[node]) visited[node] = 1;
else return;
for (int i: v[node])
dfs(v, N, i, visited);
}
int main(int argc, char **argv){
ios::sync_with_stdio(false);
cin.tie(NULL);
int N, M, s, e;
cin >> N >> M;
vector<int> visited(N+1);
vector<int> v[N+1]; // 인접리스트
for (int i = 0 ; i < M; ++i){
cin >> s >> e;
v[s].push_back(e);
v[e].push_back(s);
}
dfs(v, N, 1, visited);
int cnt = 0;
for (int i = 0; i < N+1; ++i){
if (visited[i]) ++cnt;
}
cout << cnt-1;
return 0;
}
- vector는 주소가 아닌 '깊은복사'되어 값으로 전달되기 때문에 &를 사용해서 주소로 전달해준다. (전역변수로 선언한다면 신경안써도 되므로 좀 더 편하긴 하다. 연습삼아 저렇게 코딩한다.)