연결 요소의 개수 
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
문제풀이
2021.10.26 - [Programming/Algorithm] - [BFS] BOJ 2606번, 바이러스 (JAVA)
[BFS] BOJ 2606번, 바이러스 (JAVA)
바이러스 문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게
snowoo.tistory.com
이 문제 와 유사한 문제로 백준 2026번 바이러스 라는 문제가 있다.
이 문제도 바이러스 문제와 마찬가지로 BFS, DFS, UNION FIND 로 해결할 수 있다.
소스코드
import java.util.*;
import java.io.*;
class Main{
static int n, m;
static List<Integer>[] nodes;
static boolean[] visited;
static int ans;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
nodes = new ArrayList[n+1];
visited = new boolean[n+1];
for(int i=1;i<=n;i++)
nodes[i] = new ArrayList<>();
for(int i=0;i<m;i++)
{
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
//노드의 두 정점을 연결
nodes[a].add(b);
nodes[b].add(a);
}
for(int i=1;i<=n;i++)
{
if(!visited[i])
{
bfs(i);
ans++;
}
}
System.out.println(ans);
}
public static void bfs(int node)
{
Queue<Integer> q = new LinkedList<>();
q.add(node);
visited[node] = true;
while(!q.isEmpty())
{
int now = q.poll();
for(int next : nodes[now])
{
if(!visited[next])
{
visited[next] = true;
q.add(next);
}
}
}
}
}
'Programming > Algorithm' 카테고리의 다른 글
[Dijkstra] BOJ 1753번, 최단경로(JAVA) (0) | 2021.10.26 |
---|---|
[BFS, DFS] BOJ 14502번, 연구소(JAVA) (0) | 2021.10.26 |
[BFS] BOJ 1697번, 숨바꼭질 (JAVA) (0) | 2021.10.26 |
[BFS] BOJ 1012번, 유기농 배추 (JAVA) (0) | 2021.10.26 |
[BFS] BOJ 7576번, 토마토 (JAVA) (0) | 2021.10.26 |