[백준/BOJ] 백준 1613번 : 역사

2020. 8. 18. 06:56알고리즘 문제풀이

https://www.acmicpc.net/problem/1613

 

1613번: 역사

첫째 줄에 첫 줄에 사건의 개수 n(400 이하의 자연수)과 알고 있는 사건의 전후 관계의 개수 k(50,000 이하의 자연수)가 주어진다. 다음 k줄에는 전후 관계를 알고 있는 두 사건의 번호가 주어진다. ��

www.acmicpc.net

here위치일 때 dest까지 도달할 수 있는지 확인하는 함수를 만들어서 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;

int n, k;
int front_event, back_event;
int s;
int event1, event2;
vector<int> adj[401];
int visited[401];

//here위치일때 dest까지 도달 할 수 있는지 확인
bool Solve(int here, int dest)
{
	bool ret = false;

	visited[here] = 1;

	//dest에 도달 했을때
	if (here == dest)
		return true;

	for (int i = 0; i < adj[here].size(); i++)
	{
		int there = adj[here][i];

		if (visited[there] == 0)
		{
			ret = Solve(there, dest);

			if (ret == true)
				break;
		}
	}

	return ret;
}

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

	cin >> n >> k;

	for (int i = 0; i < k; i++)
	{
		cin >> front_event >> back_event;
		adj[front_event].push_back(back_event); //그래프를 만든다
	}

	cin >> s;

	for (int i = 0; i < s; i++)
	{
		cin >> event1 >> event2;

		memset(visited, 0, sizeof(visited));
		if (Solve(event1, event2))
		{
			cout << -1 << "\n";
		}

		else
		{
			memset(visited, 0, sizeof(visited));
			if (Solve(event2, event1))
			{
				cout << 1 << "\n";
			}

			else
				cout << 0 << "\n";
		}
	}

	return 0;
}