반응형
Notice
Recent Posts
Recent Comments
- Today
- Total
작심삼일
[백준] 1325번 | 효율적인 해킹 | C++ 본문
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
반응형
'스터디 > 코테' 카테고리의 다른 글
[백준] 1406번 | 에디터 | C++ (0) | 2021.11.15 |
---|---|
[백준] 1373번 | 2진수 8진수 | C++ (0) | 2021.11.12 |
[백준] 1158번 | 요세푸스 문제 | c++ (0) | 2021.11.10 |
[백준] 1152번 | 단어의 개수 | python (0) | 2021.11.09 |
[백준] 1107번 | 리모컨 | c++ (0) | 2021.11.08 |
Comments