https://www.acmicpc.net/problem/9372
9372번: 상근이의 여행
문제 상근이는 겨울방학을 맞아 N개국을 여행하면서 자아를 찾기로 마음먹었다. 하지만 상근이는 새로운 비행기를 무서워하기 때문에, 최대한 적은 종류의 비행기를 타고 국가들을 이동하려고 한다. 이번 방학 동안의 비행 스케줄이 주어졌을 때, 상근이가 가장 적은 종류의 비행기를 타고 모든 도시들을 여행할 수 있도록 도와주자. 상근이가 한 국가에서 다른 국가로 이동할 때 다른 국가를 거쳐 가도(심지어 이미 방문한 국가라도) 된다. 입력 첫 번째 줄에는 테스트 케
www.acmicpc.net
풀고 나니까 되게 허탈한 문제였다. 나는 BFS로 구현해서 풀었다. 현재 노드에서 다른 노드로 왕복 가능한 비행기들이 주어지고 출발점부터 모든 노드까지 이동 가능한 경로를 세어주면 된다. 방문한 곳은 다시 방문하지 않는다. 그러면 자연스럽게 중복된 경로는 세지 않게 된다. 그런데 이렇게 풀 필요가 없이 최소 스패닝 트리를 구하면 되고 모든 경로를 한번씩 모두 거쳐만 가면 되니까 주어진 나라의 갯수에서 -1만 하면 된다. 허탈했다.
#include <iostream>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
int T, N, M;
int a, b;
int cnt = 0;
int x;
bool visit[1001];
vector<int> v[1001];
queue<int> q;
//bfs로 구현, 방문한 곳은 재방문하지 않는다.
void bfs(int x) {
q.push(x);
visit[x] = true;
while (!q.empty()) {
x = q.front();
q.pop();
for (int i = 0; i < v[x].size(); i++) { //현재 노드에서 도달 가능한 노드르 모두 탐색한다.
if (!visit[v[x][i]]) {
visit[v[x][i]] = true;
q.push(v[x][i]);
cnt++;
}
}
}
}
int main() {
cin >> T;
for (int i = 0; i < T; i++) {
cin >> N >> M;
//초기화
cnt = 0;
for (int j = 0; j < 1001; j++) {
v[j].clear();
}
memset(visit, false, sizeof(visit));
for (int j = 0; j < M; j++) {
cin >> a >> b;
if (j == 0) {
x = a;
}
v[a].push_back(b); //a -> b
v[b].push_back(a); //b -> a
}
bfs(x);
cout << cnt << '\n';
}
}
'백준' 카테고리의 다른 글
백준2096 - 내려가기 (0) | 2020.01.18 |
---|---|
백준1654 - 랜선 자르기 (0) | 2020.01.16 |
백준9019 - DSLR (0) | 2020.01.05 |
백준1669 - 멍멍이 쓰다듬기 (0) | 2019.12.29 |
백준1309 - 동물원 (0) | 2019.12.27 |