Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

별 그래프(Star Graph) 판별 알고리즘 – 원리와 C++ 구현 예제

별 그래프란 무엇인가?

하나의 그래프가 주어졌을 때, 이 그래프가 별 그래프(star graph)인지 아닌지를 판별하는 문제입니다.

별 그래프는 하나의 중심 정점이 나머지 모든 정점과 간선으로 연결되어 있고, 중심 정점을 제외한 정점들 사이에는 어떠한 간선도 존재하지 않는 트리 형태의 그래프입니다. 마치 별이 빛을 뻗는 모습과 닮았다고 하여 '별 그래프'라고 부릅니다.

따라서 그래프를 순회하면서 차수(degree)가 1인 정점의 개수차수가 n-1인 정점의 개수를 구해야 합니다. (여기서 n은 주어진 그래프의 정점 개수입니다.) 차수가 1인 정점이 n-1개이고, 차수가 n-1인 정점이 정확히 1개라면 해당 그래프는 별 그래프입니다.

별 그래프(Star Graph) 판별 알고리즘 – 원리와 C++ 구현 예제

입력 및 출력

입력 (인접 행렬):
0 1 1 1
1 0 0 0
1 0 0 0
1 0 0 0

출력:
It is a star graph. (별 그래프입니다.)

알고리즘

checkStarGraph(graph)

입력: 주어진 그래프

출력: 그래프가 별 그래프이면 참(true), 아니면 거짓(false)

의사 코드(Pseudocode)

시작
    degOneVert := 0, degNminOneGraph := 0
    만약 그래프에 정점이 하나뿐이라면
        자기 루프(self-loop)가 없으면 true 반환
    아니면 만약 그래프에 정점이 두 개라면
        두 정점 사이에 간선이 하나만 존재하면 true 반환
    아니면
        그래프의 모든 정점 i에 대해 반복
            degree := 0
            i와 인접한 모든 정점 j에 대해 반복
                degree := degree + 1
            종료
            만약 degree = 1이면
                degOneVert := degOneVert + 1
            아니면 만약 degree = n-1이면
                degNminOneGraph := degNminOneGraph + 1
        종료

    만약 degOneVert = n-1이고 degNminOneGraph = 1이면
        true 반환
    그렇지 않으면 false 반환
종료

C++ 구현 예제

#include<iostream>
#define NODE 4
using namespace std;

int graph[NODE][NODE] = {
   {0, 1, 1, 1},
   {1, 0, 0, 0},
   {1, 0, 0, 0},
   {1, 0, 0, 0}
};

bool checkStarGraph() {
   int degOneVert = 0, degVert = 0;    //초기에 차수가 1인 정점과 차수가 n-1인 정점의 개수는 0
   if (NODE == 1)   //정점이 하나뿐인 경우
      return (graph[0][0] == 0);

   if (NODE == 2)
      return (graph[0][0] == 0 && graph[0][1] == 1 && graph[1][0] == 1 && graph[1][1] == 0 );

   for (int i = 0; i < NODE; i++) {   //정점이 3개 이상인 그래프 처리
      int degree = 0;
      for (int j = 0; j < NODE; j++)   //정점 i의 차수 계산
         if (graph[i][j])
            degree++;
      if (degree == 1)
         degOneVert++;
      else if (degree == NODE-1)
         degVert++;
   }
   //차수가 n-1인 정점이 하나뿐이고, 나머지 정점의 차수가 모두 1이면 별 그래프
   return (degOneVert == (NODE-1) && degVert == 1);
}

int main() {
   if(checkStarGraph())
      cout << "It is a star graph.";
   else
     cout << "It is not a star graph.";
}

실행 결과

It is a star graph.

시간 복잡도

위 알고리즘은 인접 행렬을 한 번 전체 순회하므로 시간 복잡도는 O(n²)입니다. 만약 인접 리스트(adjacency list)를 사용하여 그래프를 표현하면 각 정점의 차수를 더 효율적으로 얻을 수 있어, 시간 복잡도를 O(V+E)까지 줄일 수 있습니다.