작심삼일

[백준] 1325번 | 효율적인 해킹 | C++ 본문

스터디/코테

[백준] 1325번 | 효율적인 해킹 | C++

yun_s 2021. 11. 11. 14:36
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1325


문제

해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다. 이 회사는 N개의 컴퓨터로 이루어져 있다. 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹 할 수 있는 컴퓨터를 해킹하려고 한다.

이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.

이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다. 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.


출력

첫째 줄에, 김지민이 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 오름차순으로 출력한다.


내 풀이

무한루프에 빠지지 않도록 주의하며 각 컴퓨터가 어떤 컴퓨터를 신뢰하는지 그래프를 그린다.


코드

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define MAX 10001

int com, line;
bool visit[MAX];
int total[MAX];
int max_count = 0;
vector < vector<int>> trust;

int max(int a, int b)
{
	return ((a > b) ? a : b);
}

int DPS(int start) {
	visit[start] = true;

	int ret = 0;
	for (int x = 0; x < (int)trust[start].size(); x++) {

		if (!visit[trust[start][x]]) {
			ret += DPS(trust[start][x]) + 1;
		}
	}

	return ret;
}

int main() {
	int from, to;
	scanf("%d %d", &com, &line);

	trust.resize(com+1);

	for (int x = 0; x < line; x++) {
		scanf("%d %d", &from, &to);
		trust[to].push_back(from);
	}

	for (int x = 0; x < com; x++) {
		total[x] = DPS(x+1);
		max_count = max(max_count, total[x]);

		memset(visit, 0, sizeof(visit));
	}

	for (int x = 0; x < com; x++) {
		if (total[x] == max_count) {
			printf("%d ", x+1);
		}
	}

	return 0;
}
728x90
반응형
Comments