inflearn logo
강의

Course

Instructor

Do it! Algorithm Coding Test with C++

Union-Find

백준 1876여행 유니온 파인드 질문있습니다.

241

starkshn

134 asked

0

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

#define ll long long
#define endl "\n"

void merge(int a, int b);
int find(int a);
vector<int> parent;
vector<int> paths;

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

	int n, m;
	cin >> n; 
	cin >> m;

	parent.resize(n + 1);

	for (int i = 0; i <= n; ++i)
	{
		parent[i] = i;
	}

	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			int v;
			cin >> v;
			if (v == 1)
			{
				merge(i, j);
			}
		}
	}

	for (int i = 1; i <= n; ++i)
	{
		int n;
		cin >> n;
		paths.push_back(n);
	}

	int prevPath = find(paths[0]);
	for (int path : paths)
	{
		int curPath = find(path);

		if (curPath != prevPath)
		{
			cout << "NO";
			return 0;
		}

		prevPath = curPath;
	}

	cout << "YES";

	return 0;
}

void merge(int a, int b)
{
	a = find(a);
	b = find(b);

	if (a != b)
		parent[b] = a;
}

int find(int a)
{
	if (a == parent[a])
		return a;

	return parent[a] = find(parent[a]);
}

왜맞틀인거같은 느낌이 듭니다.
책에 있는 내용 분석해서 이해는 하였는데 제가 짠 코드가 왜 틀린것인지 모르겠습니다.

의심되는 부분은 처음에 merge하는 for문인거같은데
책처럼 인접리스트를 사용하지 않고 v가 1이라면(i행과 j열이 연결되어 있다면) 그냥 바로 merge하여 병합하였는데 이부분에 예외가 있는것인지 아니면 다른 부분에서 예외가 있는것인지 감이 안 잡히는데 어디가 잘 못된것인지 한번 봐주실 수 있나요?

감사합니다 :)

c++ 코딩-테스트 알고리즘

Answer 1

0

harucoding

안녕하세요. 반갑습니다.

아마도 Path를 저장하는 반복문에 약간 로직이 잘못된 것으로 보입니다.

 

해당 부분을

for (int i = 1; i <= n; ++i) {
   int n; 
   cin >> n; 
   paths.push_back(n); 
}


아래와 같이 수정하시면 되지 않을까 싶습니다.

for (int i = 1; i <= m; i++)
{
    int path;
    cin >> path;
    paths.push_back(path);
}	

 

감사합니다.

새해 복 많이 받으세요 :)

 

수강평 이벤트

0

15

2

Reticle이 안나옵니다.

0

5

1

진행 방법 질문드립니다!

0

23

2

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

18

1

Singleton 관련 질문입니다.

1

27

2

갑자기 채점 사이트가 바뀌었어요

0

19

1

42. [세그먼트 트리 실전 문제] 구간 합 구하기3 (백준 2042)

0

64

1

10986번 질문 있습니다!

0

45

0

LCA 빠르게 찾기 - 트리의 높이에 따른 k값 질문

0

119

0

백준 1377 질문있습니다

0

218

1

백준 1722 교재 81 질문

0

330

1

백준11505, 교재 73번

0

282

1

백주 1456번

0

200

1

백준 1325, 교재 47번 문제 질문입니다.

0

358

1

백준 11404 플로이드 문제 질문있습니다.

0

260

1

문제 85번 질문드립니다

0

322

1

백준 13023 질문있습니다.

0

204

1

문제 8번 질문드립니

0

305

1

백준 2251 C++ 질문 있습니다.

0

398

2

퀵정렬 질문

3

291

1

i==k일떄 i++안해도되지않나요

0

436

1

알고리즘 코딩테스트 문제풀이 강의 - 14 절댓값 힙 구현하기 (백준 11286)

0

550

1

알고리즘 코딩테스트 문제풀이 강의 - 9 DNA 비밀번호 (백준 12891)

1

573

1

C++은 실전문제에 대한 강의가 없나요? 자바나 파이썬은 있는데 없는거 같아서요.

2

591

2