Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 주어진 그래프에서 특별한 유형의 하위 그래프를 찾는 프로그램

<시간/>

머리와 발이라는 두 가지 유형의 정점이 있는 특별한 유형의 그래프가 있다고 가정합니다. 그래프에는 머리가 하나만 있고 머리를 각 발에 연결하는 k 개의 모서리가 있습니다. 무향, 무가중 그래프가 주어진다면; 우리는 그래프의 꼭짓점 disjoint subgraphs에서 이러한 특별한 유형의 그래프를 찾아야 합니다. 두 그래프에 공통 정점이 없는 경우 이 그래프는 분리된 정점이라고 합니다.

따라서 입력이 다음과 같으면

파이썬에서 주어진 그래프에서 특별한 유형의 하위 그래프를 찾는 프로그램

노드 수(n) =5, 피트 수(t) =2이면 출력은 5가 됩니다.

주어진 그래프의 정점 분리 하위 그래프인 5개의 특수 그래프가 있을 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • G :=n+1개의 빈 목록을 포함하는 새 목록
  • 가장자리의 각 항목에 대해 다음을 수행합니다.
    • :=항목[0]
    • d :=항목[1]
    • G[s] 끝에 d 삽입
    • G[d] 끝에 s 삽입
  • 방문:=새 지도
  • 0에서 n 사이의 i에 대해
    • v :=지[i]
    • v의 크기가 1과 같으면
      • :=v[0]
      • 방문 시 s가 없으면
        • 방문[s] :=[i]
      • 그렇지 않으면
        • 방문 끝에 i 추가
    • 그렇지 않으면 v의 크기가 0과 같을 때
      • n :=n - 1
  • tmp :=0
  • 방문 시 k마다 다음을 수행합니다.
    • x :=방문 크기[k] -t
    • x> 0이면
      • tmp :=tmp + x
  • n - tmp를 반환

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

def solve(n, t, edges):
    G = [[] for _ in range(n + 1)]
    for item in edges:
        s, d = map(int, item)
        G[s].append(d)
        G[d].append(s)
    visit = {}
    for i in range(n):
        v = G[i]
        if len(v) == 1:
            s = v[0]
            if s not in visit:
                visit[s] = [i]
            else: visit[s].append(i)
        elif len(v) == 0:
            n -= 1
    tmp = 0
    for k in visit:
        x = len(visit[k])-t
        if x > 0:
            tmp += x
    return n - tmp

print(solve(6, 2, [(1,4), (2,4), (3,4), (3,4), (5,3), (6,3)]))

입력

6, 2, [(1,4), (2,4), (3,4), (3,4), (5,3), (6,3)]

출력

5