본문 바로가기

백준

백준1325 - 효율적인 해킹

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

 

1325번: 효율적인 해킹

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

www.acmicpc.net

간단한 bfs 문제였다. 입력시에 b가 출발점이고 a가 도착점이라는 사실만 잊지 않으면 쉽게 푼다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
#include <algorithm>
#define MAX 10001
using namespace std;

int N, M; //N개의 컴퓨터의 갯수, M개의 연결 정보 갯수
int a, b; //a는 도착지, b는 출발지
int cnt = 0; //최대로 탐색 가능한 컴퓨터의 수
bool visit[MAX]; //컴퓨터 방문여부


vector<int> v[MAX]; //컴퓨터 연결 정보
vector<int> ans; //답으로 쓸 공간
vector<int> temp; //bfs에서 탐색할 때 방문한 컴퓨터의 번호를 저장하는 공간

void bfs(int x) {
	queue<int> q;
	q.push(x);
	visit[x] = true;
	temp.push_back(x);

	while (!q.empty()) {
		x = q.front();
		q.pop();

		for (int i = 0; i < v[x].size(); i++) {
			if (!visit[v[x][i]]) {
				q.push(v[x][i]);
				visit[v[x][i]] = true;
				temp.push_back(v[x][i]);
			}
		}
	}
}

int main() {
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; i++) {
		scanf("%d %d", &a, &b);
		v[b].push_back(a); //b를 해킹하면 a를 해킹할 수 있다.(b에서 a로 갈 수 있다.)
	}

	for (int i = 1; i <= N; i++) {
		memset(visit, false, sizeof(visit)); //모든 컴퓨터를 미방문처리
		temp.clear(); //해킹할 수 있는 컴퓨터의 번호를 담는 공간 초기화
		bfs(i);
		if (cnt > temp.size()) { //현재 해킹할 수 있는 컴퓨터의 수가 이전의 최대보다 적으면
			continue; //무시
		}
		else if (cnt == temp.size()) { //현재 해킹할 수 있는 컴퓨터의 수가 이전의 최대와 같으면
			ans.push_back(i); //현재 컴퓨터를 답에 넣는다.
		}
		else { //현재 해킹할 수 있는 컴퓨터의 수가 이전의 최대보다 많으면
			cnt = temp.size(); //이전의 최대를 현재로 바꾸고
			ans.clear(); //답을 초기화 한 공간을 날린 뒤
			ans.push_back(i); //현재 컴퓨터를 답에 넣는다.
		}
	}

	sort(ans.begin(), ans.end()); //오름 차순 정렬

	//출력
	for (int i = 0; i < ans.size(); i++) {
		printf("%d ", ans[i]);
	}
}

'백준' 카테고리의 다른 글

백준11659 - 구간 합 구하기4  (0) 2020.04.12
백준11559 - Puyo Puyo  (0) 2020.04.09
백준1780 - 종이의 갯수  (0) 2020.04.07
백준14938 - 서강그라운드  (0) 2020.04.05
백준15723 - n단 논법  (0) 2020.04.03