본문 바로가기
알고리즘 풀이

1325. 효율적인 해킹

by 남생이야 2023. 12. 20.

 

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

 

1325번: 효율적인 해킹

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

www.acmicpc.net

 

dfs로 풀었다... 

중간에 해맸는데 어찌저찌 다른 분들의 풀이를 참고를 했던 것 같다. 

내가 도달한 것은 그래프 연결을 a->b에서 b를 해킹하면 a도 해킹된다는 거니 b -> a로만 연결시켜주는 것이었다. 

나머진 최대 해킹 수를 구하는 것을 생각 못해서 참조했던거같다. 

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <cmath>
using namespace std;

#define MAX 10001

vector<int> arr[MAX];
bool visited[MAX];
int check;
int maxHack;
vector<pair<int, int>> ans; 

void dfs(int x)
{
	visited[x] = true;
	
	for (int i = 0; i < arr[x].size(); i++)
	{
		int next = arr[x][i];
		if (visited[next] == false)
		{
			check++; 
			dfs(next);
		}
	}
}

int main() {

	int n, m; 
	cin >>n >> m;

	for (int i = 0; i < m; i++) {

		int a, b ;
		cin >> a >> b;
		//arr[a].push_back(b);
		arr[b].push_back(a);
	}

	for (int i = 1; i <= n; i++)
	{
		memset(visited, false, sizeof(visited));
	
		if (visited[i] == false)
		{
			check = 0; 
			dfs(i);
			if (check > 0)
			{
				if (check > maxHack)
					maxHack = check;
			}
			ans.push_back({ i, check });
		}
		
	}

	for (int i = 0; i < ans.size(); i++)
	{
		if(maxHack == ans[i].second)
			cout << ans[i].first << " ";
	}

    return 0;
}

'알고리즘 풀이' 카테고리의 다른 글

14888번 연산자 끼워 넣기  (0) 2024.01.14
1436. 영화감독 숌  (0) 2024.01.02
1018번 체스판 다시 칠하기  (0) 2023.12.31
1743. 음식물 피하기  (0) 2023.12.25
1926. 그림  (0) 2023.12.20