알고리즘 문제풀이/백준

[백준/BOJ] 1325번 효율적인 해킹 (C++)

노력의천재 2021. 9. 20. 20:11

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

 

1325번: 효율적인 해킹

첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한

www.acmicpc.net

개인적으로 왜 정답률이 낮은지 알 수 없는 문제였다. 문제를 해결하는 포인트는 첫번째 인접리스트를 만들어 DFS를 진행하는 것이다. 두번째, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 여러 개 출력해야하므로, 가장 많은 컴퓨터를 해킹할 수 있는 경우가 갱신되면 벡터를 초기화하고 현재 컴퓨터 번호를 넣어줘야 한다. 그리고 만약 컴퓨터를 해킹할 수 있는 수가 같다면 현재 벡터에 현재 컴퓨터 번호를 추가해준다.

 

#include <iostream>
#include <vector>
#include <climits>
#include <cstring>
#include <algorithm>
using namespace std;

int N, M, maxx = INT_MIN;
vector<int> graph[10001], res;
bool visit[10001];

int getCnt(int now) {
	int cnt = 0;
	for(int i = 1; i <= N; i++) {
		if(now == i) continue;
		if(visit[i]) cnt++; 
	}
	return cnt;
}

void DFS(int node) {
	for(int i = 0; i < graph[node].size(); i++) {
		int next = graph[node][i];
		if(!visit[next]) {
			visit[next] = true;
			DFS(next);
		}
	}
}

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
		
	cin >> N >> M;
	for(int i = 0; i < M; i++) {
		int a, b;
		cin >> a >> b;
		graph[b].push_back(a);
	}
	
	for(int i = 1; i <= N; i++) {
		visit[i] = true;
		DFS(i);
		int cnt = getCnt(i);
		if(maxx < cnt) {
			maxx = cnt;
			res.clear();
			res.push_back(i);
		} else if(maxx == cnt) {
			res.push_back(i);
		}
		memset(visit, false, sizeof(visit));
	}
	
	sort(res.begin(), res.end());
	
	for(int i = 0; i < res.size(); i++) {
		cout << res[i] << " ";
	}
}