www.acmicpc.net/problem/1762

 

1762번: 평면그래프와 삼각형

첫째 줄에 두 정수 N, M이 주어진다. M은 간선의 개수를 나타내는 0 이상의 정수이다. 다음 M개의 줄에는 각 간선이 연결하는 서로 다른 두 정점의 번호가 주어진다. 같은 간선이 중복되어 입력으

www.acmicpc.net


  • 삼각형을 세는 기막힌 방법이 있다.
  • 먼저 각 노드별로 인접 노드들은 담은 리스트 형태로 구성을 한다.
  • 그리고 주어진 엣지들을 전부 탐색하며, 엣지의 양 노드의 교집합의 갯수를 구하면 삼각형의 갯수가 된다.
  • 다만 이 경우 삼각형이 중복으로 세어질 수 있기 떄문에, 인접리스트를 구성할 때 자신의 노드값보다 큰 노드들만 담는 식으로 차순을 설정하여 중복을 제거해준다.

import sys
n, m = map(int, input().split())
adjs = [set() for i in range(n+1)]
cnt = 0

for i in range(m):
    a, b = map(int, sys.stdin.readline().split())
    adjs[a].add(b) if a < b else adjs[b].add(a)		# 인접리스트 구성, 자기보다 높은 노드만 담음

for sets in adjs:		# 모든 노드들을 돌며
    for i in sets:		# 해당 노드의 인접 노드들을 돌며
        cnt += len(sets.intersection(adjs[i]))	# 교집합의 갯수를 구함

print(cnt)

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

[백준] 1987.cpp : 알파벳  (0) 2020.12.28
[백준] 1058.py : 친구  (0) 2020.12.26
[백준] 2512 : 예산  (0) 2020.09.24
[백준] 10799 : 쇠막대기  (0) 2020.09.23
[백준] 1946 : 신입 사원  (0) 2020.09.17

+ Recent posts