๊ณจ๋“œ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";
}

Reference