mojo's Blog

#738 (Div.2) C - Mocha and Hiking 본문

코드포스

#738 (Div.2) C - Mocha and Hiking

_mojo_ 2021. 8. 16. 12:16

문제 링크 => Problem - C - Codeforces

 

Problem - C - Codeforces

 

codeforces.com


그래프를 이용한 문제이다.

 

주어진 조건으로 얻은 그래프를 통해서 무조건 한번만 마을을 방문하여 모든 마을을 방문할 수 있는지를 묻는 문제이다.

 

문제에서 주어진 조건을 단순하게 요약하면 다음과 같다.

 

n(1~10000, 정수)값이 주어질 때,

 

(1) 1 번째 마을에서 2 번째 마을로 가는 도로 존재 

     2 번째 마을에서 3 번째 마을로 가는 도로 존재 

     ...

     (n - 1) 번째 마을에서 n 번째 마을로 가는 도로 존재 

 

(2) ai = 0 ) i 번째 마을에서 (n + 1) 번째 마을로 가는 도로 존재 

     ai = 1 ) (n + 1) 번째 마을에서 i 번째 마을로 가는 도로 존재

 

확실한 것은 (1) 조건만으로 1 번째 마을에서 n 번째 마을로 한번씩 방문이 가능하다는 것이다.

 

문제는 (n + 1) 번째 마을인데 다음과 같은 3가지 Case를 통해서 방문이 가능하다.

 

 

Case 1) (n + 1) 번째 마을이 1로 연결된 경우

 

Case 2) n 번째 마을이 (n + 1) 번째 마을로 연결된 경우

 

Case 3) 1 <= i <= (n - 1) 를 만족하는 i 에 대하여 i 번째 마을이 (n + 1) 번째 마을로 연결된 경우와 (n + 1) 번째 마을이 (i + 1) 번째 마을로 동시에 연결된 경우

 

풀이 code

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <math.h>
#include <map>
#include <set>
#define INF 1000000000
#define endl '\n'
#define ll long long

using namespace std;

void test() {

	int n;
	cin >> n;

	map<pair<int, int>, int> m;

	for (int i = 1; i <= n - 1; i++) {
		m[{i, i + 1}] = 1;
	}
	
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		if (x == 0) m[{i, n + 1}] = 1;
		else m[{n + 1, i}] = 1;
	}

	for (int i = 0; i <= n; i++) {
		if (i == 0) {
			if (m[{n + 1, 1}]) {
				cout << n + 1 << " ";
				for (int j = 1; j <= n; j++) cout << j << " ";
				cout << endl;
				return;
			}
		}
		else if (i == n) {
			if (m[{n, n + 1}]) {
				for (int j = 1; j <= n + 1; j++) cout << j << " ";
				cout << endl;
				return;
			}
		}
		else {
			if (m[{i, n + 1}] && m[{n + 1, i + 1}]) {
				for (int j = 1; j <= i; j++) {
					cout << j << " ";
				}
				cout << n + 1 << " ";
				for (int j = i + 1; j <= n; j++) cout << j << " ";
				cout << endl;
				return;
			}
		}
	}

	cout << -1 << endl;
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	int t;
	cin >> t;
	for (int i = 0; i < t; i++) test();

	return 0;
}

'코드포스' 카테고리의 다른 글

#740 (Div.2) C - Deep Down Below  (0) 2021.08.30
#741 (Div.2) C - Rings  (0) 2021.08.29
#738 (Div.2) B - Mocha and Red and Blue  (0) 2021.08.16
#736 (Div.2) C - Web of Lies  (0) 2021.08.02
#732 (Div.2) B - AquaMoon and Stolen String  (0) 2021.07.12
Comments