거의 알고리즘 일기장

백준 1976번 _ 여행 가자 본문

알고리즘 문제풀이

백준 1976번 _ 여행 가자

건우권 2020. 4. 25. 21:03

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

풀이방법

그냥 유니온 파인드 알고리즘 이용하면 답 나옴(밑의 url참조)

https://kunkunwoo.tistory.com/22

 

백준 1197번 _최소 스패닝 트리

https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를..

kunkunwoo.tistory.com


전체코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int parents[201];
int N, M;

void makeParents()
{
	for (int i = 1; i <= N; i++)
		parents[i] = i;
}

int getParent(int a)
{
	if (parents[a] == a) return a;
	return parents[a] = getParent(parents[a]);
}

void Union(int a, int b)
{
	a = getParent(a);
	b = getParent(b);
	if (a == b)
		return;
	parents[b] = a;
}

void Input()
{
	cin >> N;
	cin >> M;
	makeParents();
	int value;
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			cin >> value;
			if (value == 0)
				continue;

			Union(i, j);
		}
	}
}

void solve()
{
	vector<int>travel;
	int tmp;
	for (int i = 0; i < M; i++)
	{
		cin >> tmp;
		travel.push_back(tmp);
	}

	bool possible = true;
	for (int i = 0; i < M - 1; i++)
	{
		if (getParent(travel[i]) != getParent(travel[i + 1]))
			possible = false;
	}
	if (possible)
		cout << "YES";
	else
		cout << "NO";
}

int main()
{
	Input();
	solve();
	return 0;
}

후기

ㅎㅎ

반응형
Comments