๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[๋ฐฑ์ค€] 1325๋ฒˆ: ํšจ์œจ์ ์ธ ํ•ดํ‚น - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1325๋ฒˆ: ํšจ์œจ์ ์ธ ํ•ดํ‚น - C++

.23 2022. 8. 17. 15:09
๋ฌธ์ œ

ํ•ด์ปค ๊น€์ง€๋ฏผ์€ ์ž˜ ์•Œ๋ ค์ง„ ์–ด๋Š ํšŒ์‚ฌ๋ฅผ ํ•ดํ‚นํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด ํšŒ์‚ฌ๋Š” N๊ฐœ์˜ ์ปดํ“จํ„ฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊น€์ง€๋ฏผ์€ ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ๋ฒˆ์˜ ํ•ดํ‚น์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚น ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ด ํšŒ์‚ฌ์˜ ์ปดํ“จํ„ฐ๋Š” ์‹ ๋ขฐํ•˜๋Š” ๊ด€๊ณ„์™€, ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š” ๊ด€๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, A๊ฐ€ B๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” B๋ฅผ ํ•ดํ‚นํ•˜๋ฉด, A๋„ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค.

์ด ํšŒ์‚ฌ์˜ ์ปดํ“จํ„ฐ์˜ ์‹ ๋ขฐํ•˜๋Š” ๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•œ ๋ฒˆ์— ๊ฐ€์žฅ ๋งŽ์€ ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—, N๊ณผ M์ด ๋“ค์–ด์˜จ๋‹ค. N์€ 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜, M์€ 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ์‹ ๋ขฐํ•˜๋Š” ๊ด€๊ณ„๊ฐ€ A B์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋“ค์–ด์˜ค๋ฉฐ, "A๊ฐ€ B๋ฅผ ์‹ ๋ขฐํ•œ๋‹ค"๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ปดํ“จํ„ฐ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—, ๊น€์ง€๋ฏผ์ด ํ•œ ๋ฒˆ์— ๊ฐ€์žฅ ๋งŽ์€ ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.


๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ

DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€์—ˆ๋‹ค.

 

๊ทธ๋ž˜ํ”„ํƒ์ƒ‰ ์ด์™ธ์— ์ƒ๊ฐํ•ด์ค˜์•ผํ•  ๊ฒƒ๋“ค์ด ์žˆ์–ด ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์› ๋˜ ๋ฌธ์ œ.....๊ทผ๋ฐ ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์‚ฝ์งˆ์„ ๋งŽ์ด ํ•ด์„œ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์กŒ๋˜๊ฑฐ๋‹คใ…œ

 

๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ ๋ขฐ ๊ฐ€๋Šฅํ•œ ์ปดํ“จํ„ฐ๋ผ๋ฆฌ ๋ฌถ์–ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ํ†ตํ•ด ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋ฅผ ์„ธ์–ด ํ•ด๋‹น ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ–ˆ์„ ๋•Œ ๋ช‡ ๋Œ€๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค. ๊ทธ ๋’ค ๊ฐ€์žฅ ๋งŽ์€ ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‹จ์ˆœํžˆ DFS๋งŒ ๋ฉ€์ฉกํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ์‹ค ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ,,

์‹œ๊ฐ„/๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๊ณ ๋ คํ•ด์•ผ๋  ๋ถ€๋ถ„๋“ค ๋•Œ๋ฌธ์— ์ •๋‹ต๊นŒ์ง€ ์˜ค๋ž˜๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค..

 

์ฝ”๋“œ
#include <cstdio>
#include <vector>
#include <cstring>
#define MAX 10001

using namespace std;

int N, M;
int maximum, cnt;

vector<int> computer[MAX];
int counter[MAX];
bool visited[MAX];

void DFS(int num, int start);

int main(void) {
    scanf("%d %d", &N, &M);

    for(int i = 0; i < M; i++) {
        int num1, num2;
        scanf("%d %d", &num1, &num2);

        computer[num2].push_back(num1);
    }

    for(int i = 1; i <= N; i++) {
        memset(visited, false, N + 1);
        cnt = 0;
        DFS(i, i);
        maximum = (counter[i] > maximum ? counter[i] : maximum);
    }

    for(int i = 1; i <= N; i++) {
        if(counter[i] == maximum)
            printf("%d ", i);
    }
    printf("\n");
    return 0;
}

void DFS(int num, int start) {
    visited[num] = true;
    int len = computer[num].size();

    for(int i = 0; i < len; i++) {
        int next = computer[num][i];

        if(!visited[next]) {
            cnt++;
            DFS(next, start);
        }
    }

    counter[start] = (counter[start] > cnt ? counter[start] : cnt);
}
Comments