[백준 문제] 13023번 ABCDE - 그래프 문제 (파이썬)


[백준 문제] 13023번 ABCDE - 그래프 문제 (파이썬)

그래프에 대한 정리

  • 그래프는 정점(Node, Vertex) 와 간선(Edge:정점간의 관계(선))) 으로 이루어짐
  • 차수 : 정점과 연결되어 있는 간선의 개수
  • 인접 행렬 : i->j 간선이 있을때를 1, 없을때를 0 으로한 행렬
  • 인접 리스트 : 예로 [[1], [0, 2], [1, 3], [2, 4], [3]] 이런식으로 나타나며 정점의 순서로 무엇이랑 연결되어있는지 리스트 형태
  • 간선 리스트 : 모든 간선을 나타내는 형식. 예로 [(0,1), (1,0), (1,2)]
import sys
# n : 노드 수, m : 간선 수
n,m = map(int,input().split())
edges = [] # 간선 리스트 만들기
# 인접 행렬(Adjacency-matrix)로 간선이 있을 때 True값을 내보냄.
a = [[False]*n for _ in range(n)] 
# 인접 리스트 만들기
g = [[] for _ in range(n)]

for _ in range(m):
    u, v = map(int,input().split())
    # 간선 리스트인 edge에 [(0,1), (1,0), (1,2)] 형식으로 넣는다.
    edges.append((u,v))
    edges.append((v,u))
    # 인접행렬에 체크를 한다. 방향이 없는 그래프기 때문에 y=x 대칭이여야함
    a[u][v] = a[v][u] = True
# 인접 리스트 데이터 넣기 
    g[u].append(v)
    g[v].append(u)
    
# 간선이 왼쪽 오른쪽으로 두번 행해지므로 m = m * 2
m *= 2
for i in range(m):
    for j in range(m):
        A, B = edges[i]
        C, D = edges[j]
        # A-B, C-D는 그냥 간선이기 때문에, 간선 리스트로 찾을 수 있다.
        # 그러므로 A~D가 모두 달라야함.
        if A == B or A == C or A == D or B == C or B == D or C == D:
            continue
        # B-C는 인접행렬 a[B][C]가 True가 아니면 되돌아간다.
        if not a[B][C]:
            continue
        # D-E는 인접 리스트로 찾는다. 예. g = [[1], [0, 2], [1, 3], [2, 4], [3]]
        # 이 예.에서는 4가 A, B, C, D와 다 다르기 때문에 print(1)을 내보낸다.
        for E in g[D]:
            if A == E or B == E or C == E or D == E:
                continue
            print(1)
            sys.exit(0)
# 아무 케이스도 없으면 print(0)을 내보낸다.
print(0)





© 2018. by statssy

Powered by statssy