[1325] 효율적인 해킹, c++

2021. 2. 7. 00:10·DEV/PS

[1325] 효율적인 해킹

 

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

 

1325번: 효율적인 해킹

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

www.acmicpc.net

한줄 후기 : 이땐 그래프가 재밌었는데..

 

효율적인 해킹 이 문제도 전형적인 그래프 문제인데 작년에 풀다 실패했었다. 시간초과 나서

그리고 다시 풀어봄. AC 성공

BFS로 풀었다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> com[10001];
int n, m, cnt=0;
void bfs(int start){
	queue<int> q;
	int visit[10001]={0};
	visit[start] = 1;
	q.push(start);
	while(!q.empty()){
		int x = q.front();
		q.pop();
		for(int i=0; i<com[x].size(); i++){
			int y = com[x][i];
			if(!visit[y]){
				q.push(y);
				visit[y] = 1;
				cnt++;
			}
		}
	}
}
int main(){
	int arr[10001]={0};
	scanf("%d %d", &n, &m);
	int x, y, max2=0;
	for(int i=0; i<m; i++){
		scanf("%d %d", &x, &y);
		com[y].push_back(x);
	}
	for(int i=1; i<=n; i++){
		if(!com[i].empty()){
			bfs(i);
			arr[i] = cnt;
			cnt = 0;
		}
	}
	for(int i=1; i<=n; i++){
		max2 = max(arr[i], max2);
	}
	for(int i=1; i<=n; i++){
		if(max2 == arr[i])	printf("%d ", i);
	}
	return 0;
}

풀이) 정말 간단하다. A->B 신뢰, B 해킹시 A도 해킹 가능 => 단방향그래프!

반대로 생각해야하기 때문에 입력을 거꾸로 받아줘야 편함.

벡터로 링크드 리스트 구현 후 각각의 정점을 기준으로 BFS 돌면서 cnt개수를 증가시켜 준다. 그 후 기록할 배열에 해킹 할 수 있는 컴퓨터 수를 저장

마지막으로 max 값들의 정점 번호를 순서대로 출력해 주면 된다.

사실 작년에 풀었을 때는 괜히 시간초과 날까봐 cnt를 바로바로 max로 만들어줬었다. 근데 그게 오히려 오래 걸린 듯

​

// 시간초과
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> com[10001];
vector<int> result_cnt;
int num;
long long cnt=0;
void dfs(int n){
	bool visit[10001] = {false};
	for(int i=1; i<=com[n].size(); i++){
		int next = com[n][i-1];
		if(!visit[next]){
			cnt++;
			visit[next] = true;
			dfs(next);
		}
	}
}
int main(){
	int m;
	int x,y, max=-1;
	cin >> num >> m;
	for(int i=0; i<m; i++){
		scanf("%d %d", &x, &y);
		com[y].push_back(x);
	}
	for(int i=1; i<=num; i++){
		if(!com[i].empty()){
			cnt=0;
			dfs(i);
			if(max < cnt){
				result_cnt.clear();
				result_cnt.push_back(i);
				max = cnt;
			}
			else if(max == cnt){
				result_cnt.push_back(i);
			}
		}
	}
	for(int i=0; i< result_cnt.size(); i++){
		cout << result_cnt[i] << " ";
	}
}

보면 result_cnt 벡터에 그때 그때 cnt 맥스 값을 바꿔주느라 더 오래 걸린 것 같음. 답은 제대로 나왔었다.

아무튼 그래도 실패했던 문제 성공해서 기분 좋았음.

저작자표시 (새창열림)

'DEV > PS' 카테고리의 다른 글

[2579] 계단 오르기, c++  (0) 2021.02.07
[11403] 경로 찾기, c++  (0) 2021.02.07
[2468] 안전 영역, c++  (0) 2021.02.07
[9372] 상근이의 여행​, c++  (0) 2021.02.07
[1012] 유기농 배추, c++  (0) 2021.02.07
'DEV/PS' 카테고리의 다른 글
  • [2579] 계단 오르기, c++
  • [11403] 경로 찾기, c++
  • [2468] 안전 영역, c++
  • [9372] 상근이의 여행​, c++
jobchae
jobchae
말하는 감자지만, 코드를 끄적이는 Node.js 백엔드 개발자입니다.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    오늘
    어제
    • 🚀 JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • 잡다한 개발 일지 (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • 축구 (0)
      • 일상 (19)
      • 영화 (3)
      • 음악 (8)
  • 블로그 메뉴

    • 💻 Github
    • 🙋🏻 Linkedin
    • 📖 방명록
  • 링크

    • PS Github
  • 공지사항

  • 인기 글

  • 태그

    react
    리액트
    db
    boj
    우선순위큐
    Nest.js
    typescript
    node.js
    mongoDB
    BFS
    일상
    백준
    nodejs
    DFS
    개발
    솝트
    회고
    Express
    이분탐색
    GitHub
    위상정렬
    앱잼
    렛츠락페스티벌
    슬랙봇
    슬랙
    PS
    SOPT
    DP
    알고리즘
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jobchae
[1325] 효율적인 해킹, c++
상단으로

티스토리툴바