๊ณจ๋4 : ์ ๋์จ ํ์ธ๋ ๋ฌธ์ ์ด๋ค.
์๊ฐ
์ด ๋ฌธ์ ์ ํต์ฌ์ ๊ฐ ์ ์๋์ง ์๋์ง๋ฅผ ํ๋จํ๋ ๊ฒ์ด๋ค. ์ฒ์์ ๊ทธ๋ํ๋ผ๊ณ ์๊ฐํ๊ณ ์ ๊ทผํ๋, dfs๋ฅผ ์ํํ ๋ depth๊ฐ ๋๋ฌด ๊น์ด์ ธ ํฐ์ง ๊ฒ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์งํํ๋ค.
๊ฐ ์ ์๋ ์ง ์๋ ์ง๋ฅผ ํ๋จํ๊ธฐ ์ํด์ ํด๋น ๋ฌธ์ ์์ ๊ฐ์ฅ ์ค์ํ ์กฐ๊ฑด์, ๊ทธ๋ํ์ ๋ฐฉํฅ์ฑ์ด ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐฉํฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ผ๋จ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ค์ ์ด๋ป๊ฒ๋ ์๋ก์ ๋ ธ๋์ ๋ฐฉ๋ฌธํ ์ ์๋ค. ์ด ์ ์ด ํต์ฌ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํน์ ๋ ธ๋๊ฐ ์ด๋์ ์ํด์๋ ์ง, ์ด๋ ๊ทธ๋ํ ๋ฌถ์์ ์ํด์๋ ์ง๋ฅผ ํ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ ๋์จ ํ์ธ๋
๊ทธ๋ ๋ค๋ฉด ๊ฒฐ๊ตญ ์ด๋ ํ ์งํฉ์ ์ํด์๋์ง๋ฅผ ํ๋จํด์ผ ํ๋ ๋ฌธ์ ๋ก ๋ฐ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ด ๋ฌธ์ ๋ ์ ๋์จ ํ์ธ๋๋ก ํด๊ฒฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํด ๋ณด์ธ๋ค.
(1, 2)
์ด๋ฐ์์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ๊ฐ์ ํ ๊ฒฝ์ฐ, 2์ ๋ ธ๋์ ์กฐ์์ 1์ ๋ ธ๋์ ์กฐ์์ผ๋ก ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Code
#include<iostream>
using namespace std;
int a[201];
int find(int x) {
if (x == a[x]) return x;
return a[x] = find(a[x]);
}
void Union(int x, int y) {
x = find(x);
y = find(y);
a[x] = y;
}
int main(void) {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
a[i] = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int input;
cin >> input;
if (input) {
Union(i, j);
}
}
}
int route[1000], par;
for (int i = 0; i < m; i++) {
cin >> route[i];
if (i == 0) {
par = find(route[i]);
}
else {
if (par != find(route[i])) {
cout << "NO";
return 0;
}
}
}
cout << "YES";
}