본문 바로가기
알고리즘!/Graph

[C] 11724: 연결 요소의 개수

by soeayun 2023. 8. 6.

일단 이 문제도 결국  그래프 탐색 문제이다.

최단 거리와 관계가 없고 그냥 그래프가 서로 이어져 있냐만 확인하면 되므로

Depth-first(깊이 우선탐색)을 이용하여 인접행렬을 통해 문제를 풀었다.

 

여기서 유일하게 주의해야 할점은 노드가 하나라도 독립적인 연결 요소가 된다는 것이다.

그렇기 때문에 인접행렬에서 자기자신에게 가는 간선도 추가해줘야 간단히 풀 수 있다.

 

#include <stdio.h>

int graph[1001][1001];
int visit[1001][1001];

void dfs(int n, int line, int x, int y)
{
  for(int i=1;i<=n;i++)
    {
      if(graph[x][i]==1 && visit[x][i]==0)
      {
        visit[x][i]=1;
        dfs(n,line,i,x);
        
      }
    }
}

int main(void)
  {
    int node,line,cnt=0;
    scanf("%d %d",&node,&line);

    for(int i=1;i<=node;i++)
      {
        graph[i][i]=1;
      }

    for(int i=1;i<=line;i++)
      {
        int a,b;
        scanf("%d %d",&a,&b);
        graph[a][b]=1;
        graph[b][a]=1;

      }
    for(int j=1;j<=node;j++)
      {
        for(int i=1;i<=node;i++)
          {
            if(visit[j][i]==0 && graph[j][i]==1)
            {
              visit[j][i]=1;
              //if()
              dfs(node,line,i,j);
              cnt++;
            }
          }
      }
    

    printf("%d",cnt);
    
  }

'알고리즘! > Graph' 카테고리의 다른 글

[C] 21736: 헌내기는 친구가 필요해  (0) 2023.08.23
[C] 14940: 쉬운 최단거리  (0) 2023.08.21
[C] 7569: 토마토  (0) 2023.08.04
[C] 1389: 케빈 베이컨의 6단계 법칙  (0) 2023.08.03
[C] 10026: 적록색약  (0) 2023.07.30