-
[BOJ 20955, Python 3] 민서의 응급 수술알고리즘/BOJ 2021. 8. 31. 23:16반응형
https://www.acmicpc.net/problem/20955
20955번: 민서의 응급 수술
민서는 강원대학교 컴퓨터공학과의 신임 교수이다. 그녀가 저술한 효율적인 택배 배달을 위한 최적 경로 설계에 관한 연구 논문은 아직도 널리 인용되고 있다. 오늘도 열심히 강의를 하던 민서
www.acmicpc.net
풀이
일단 연결되지 않은 두 뉴런을 연결할 때를 생각해보면 트리와 트리를 연결할 때만 필요하다는 것을 알 수 있습니다. 우선 이 값은 (트리의 수) - 1로 결정됩니다.
이미 연결된 두 뉴런을 끊을 때를 생각해보면 하나의 연결 요소를 트리로 만들 때만 사용한다는 것을 알 수 있습니다. 이건 bfs나 dfs를 이용해서 사용하는 간선을 구해주면 됩니다.
이러면 (해당 연결 요소의 간선의 개수) - (사용하는 간선의 개수)만큼만 끊어주면 트리가 됩니다.
연결 요소가 여러 개이므로 (전체 간선의 개수) - (사용하는 간선의 개수)
그래서 코드는 연결 요소의 개수를 구하면서 1번 정점부터 확인하여 bfs를 통해 사용하는 간선의 개수를 구해주고, bfs가 전부 끝난다면 (트리의 수 - 1) + (전체 간선의 개수 - 사용하는 간선의 개수)를 출력해주면 됩니다.
코드
1234567891011121314151617181920212223input = __import__('sys').stdin.readlinen, m = map(int, input().split())adj = [[] for _ in range(n+1)]visit = [0] * (n + 1)for i in range(m):u, v = map(int, input().split())adj[u].append(v)adj[v].append(u)ans = -1edge = 0for i in range(1, n+1):if not visit[i]:ans += 1visit[i] = 1q = __import__('collections').deque([i])while q:x = q.popleft()for nx in adj[x]:if not visit[nx]:visit[nx] = 1q.append(nx)edge += 1print(ans + m - edge)cs 반응형'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 20957, C++] 농부 비니 (0) 2021.08.31 [BOJ 20956, Python 3] 아이스크림 도둑 지호 (0) 2021.08.31 [BOJ 20954, Python 3] 택배 기사 민서 (0) 2021.08.31 [BOJ 20953, Python 3] 고고학자 예린 (0) 2021.08.31 [BOJ 20952, Python 3] 게임 개발자 승희 (0) 2021.08.25