어흥

[백준 1976] 여행 가자 (C++) 본문

알고리즘/백준

[백준 1976] 여행 가자 (C++)

라이언납시오 2020. 4. 9. 15:00
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1976

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할

www.acmicpc.net

1. 주의할 점

- Node를 Cluster로 묶을 수 있어야 한다

- 중복 방문하는 Node에 대한 처리를 해야 한다

 

2. 구현

- Node에서 다른 Node로 갈 수 있는 정보를 V 벡터에 담는다

- 방문하려는 Node중 1개를 골라서 Queue에 넣고 간선을 타고 이동할 수 있는 모든 Node에 대해 체크해준다

- 큐가 마친후, 방문 하려는 Node가 방문 가능하다고 체크되어 있지 않다면 NO 출력하고 체크되어 있다면 YES를 출력한다

 

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
vector<int> v[201];
bool need_visit[201] = { false, };
bool visit[201] = { false, };

int main() {
	int node, m, val, tt = -1;
	cin >> node >> m;
	for (int i = 1; i <= node; i++) {
		for (int j = 1; j <= node; j++) {
			cin >> val;
			if (val == 1) {
				v[i].push_back(j);
				v[j].push_back(i);
			}
		}
	}
	for (int i = 0; i < m; i++) {
		cin >> val;
		if (tt == -1) tt = val;
		need_visit[val] = true;
	}
	queue<int> q;
	q.push(tt);
	visit[tt] = true;
	need_visit[tt] = false;
	while (!q.empty()) {
		int cidx = q.front();
		q.pop();
		for (int i = 0; i < v[cidx].size(); i++) {
			int next = v[cidx][i];
			if (!visit[next]) {
				visit[next] = true;
				q.push(next);
				if (need_visit[next])	need_visit[next] = false;
			}
		}
	}
	bool avail = true;
	for (int i = 1; i <= node; i++) {
		if (need_visit[i]) {
			avail = false;
			break;
		}
	}
	if (avail) cout << "YES";
	else cout <<"NO";
	system("pause");
	return 0;
}
728x90
반응형
Comments