๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS

[BOJ][C++] ๋ฐฑ์ค€ 9466๋ฒˆ: ํ…€ ํ”„๋กœ์ ํŠธ

์„ ๋‹ฌ 2023. 5. 4. 23:08
๋ฐ˜์‘ํ˜•

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

 

9466๋ฒˆ: ํ…€ ํ”„๋กœ์ ํŠธ

์ด๋ฒˆ ๊ฐ€์„ํ•™๊ธฐ์— '๋ฌธ์ œ ํ•ด๊ฒฐ' ๊ฐ•์˜๋ฅผ ์‹ ์ฒญํ•œ ํ•™์ƒ๋“ค์€ ํ…€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ ํŒ€์› ์ˆ˜์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. ์‹ฌ์ง€์–ด ๋ชจ๋“  ํ•™์ƒ๋“ค์ด ๋™์ผํ•œ ํŒ€์˜ ํŒ€์›์ธ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํ•œ ํŒ€๋งŒ ์žˆ์„

www.acmicpc.net

 

๋ฌธ์ œ

์ด๋ฒˆ ๊ฐ€์„ํ•™๊ธฐ์— '๋ฌธ์ œ ํ•ด๊ฒฐ' ๊ฐ•์˜๋ฅผ ์‹ ์ฒญํ•œ ํ•™์ƒ๋“ค์€ ํ…€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ ํŒ€์› ์ˆ˜์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. ์‹ฌ์ง€์–ด ๋ชจ๋“  ํ•™์ƒ๋“ค์ด ๋™์ผํ•œ ํŒ€์˜ ํŒ€์›์ธ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํ•œ ํŒ€๋งŒ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ ํŒ€์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด, ๋ชจ๋“  ํ•™์ƒ๋“ค์€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ํ•˜๊ณ  ์‹ถ์€ ํ•™์ƒ์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. (๋‹จ, ๋‹จ ํ•œ ๋ช…๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.) ํ˜ผ์ž ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ํ•™์ƒ์€ ์ž๊ธฐ ์ž์‹ ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•™์ƒ๋“ค์ด(s1, s2, ..., sr)์ด๋ผ ํ•  ๋•Œ, r=1์ด๊ณ  s1์ด s1์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜, s1์ด s2๋ฅผ ์„ ํƒํ•˜๊ณ , s2๊ฐ€ s3๋ฅผ ์„ ํƒํ•˜๊ณ ,..., sr-1์ด sr์„ ์„ ํƒํ•˜๊ณ , sr์ด s1์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•œ ํŒ€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ๋ฐ˜์— 7๋ช…์˜ ํ•™์ƒ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ํ•™์ƒ๋“ค์„ 1๋ฒˆ๋ถ€ํ„ฐ 7๋ฒˆ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ, ์„ ํƒ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1234567
3 1 3 7 3 4 6

์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด (3)๊ณผ (4, 7, 6)์ด ํŒ€์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. 1, 2, 5๋Š” ์–ด๋Š ํŒ€์—๋„ ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฃผ์–ด์ง„ ์„ ํƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์–ด๋Š ํ”„๋กœ์ ํŠธ ํŒ€์—๋„ ์†ํ•˜์ง€ ์•Š๋Š” ํ•™์ƒ๋“ค์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์—๋Š” ํ•™์ƒ์˜ ์ˆ˜๊ฐ€ ์ •์ˆ˜ n (2 ≤ n ≤ 100,000)์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๋‘˜์งธ ์ค„์—๋Š” ์„ ํƒ๋œ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (๋ชจ๋“  ํ•™์ƒ๋“ค์€ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค.)

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ํ•œ ์ค„์— ์ถœ๋ ฅํ•˜๊ณ , ๊ฐ ์ค„์—๋Š” ํ”„๋กœ์ ํŠธ ํŒ€์— ์†ํ•˜์ง€ ๋ชปํ•œ ํ•™์ƒ๋“ค์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด ๋œ๋‹ค.

 

ํ’€์ด

๊ธฐ๋ณธ ์ ‘๊ทผ๋ฐฉ์‹์€ 1์ฐจ์› dfs

์‚ฌ์ดํด์„ ์ฐพ์•„๋‚ด์„œ ์‚ฌ์ดํด์— ์†ํ•œ ํ•™์ƒ๋“ค์˜ ์ˆ˜๋ฅผ ์นด์šดํŠธ

์ดํ›„ ์ „์ฒด ํ•™์ƒ - ์‚ฌ์ดํด์— ์†ํ•œ ํ•™์ƒ ์ˆ˜ ๋ฆฌํ„ด

#include <iostream>
#include <vector>

using namespace std;

int n, teamed;
vector<int> v;
vector<bool> visit;
vector<bool> finished;

void dfs(int cur) {
    visit[cur] = true;
    int next = v[cur];
    if(!visit[next]) // ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ
        dfs(next);
    else if(!finished[next]) { // ๋ฐฉ๋ฌธํ–ˆ๋Š”๋ฐ ํŒ€ ์—†๋Š” ๊ฒฝ์šฐ
        teamed++; // cur์€ ํŒ€์— ์†ํ•ฉ๋‹ˆ๋‹ค
        for(int i=next; i!=cur; i = v[i]) // next๋ถ€ํ„ฐ ์‚ฌ์ดํด์— ์†ํ•œ ํ•™์ƒ ์ˆ˜ ์นด์šดํŠธ
            teamed++;
    }
    finished[cur] = true; // ํƒ์ƒ‰ ์™„
}

int main() {
    int t;
    cin >> t;
    while(t--) {
        // ์ž…๋ ฅ
        cin >> n;
        v.assign(n+1, 0);
        for(int i=1; i<=n; i++)
            cin >> v[i];
        
        // ์—ฐ์‚ฐ
        teamed = 0;
        visit.assign(n+1, false);
        finished.assign(n+1, false);
        for(int i=1; i<=n; i++) {
            if(!visit[i]) 
                dfs(i);
        }
        
        // ์ถœ๋ ฅ
        cout << n-teamed << "\n";
    }
    return 0;
}

 

๋ฐ˜์‘ํ˜•