📝 Coding Test Study/Algorithm Problem

[C++][Beakjoon] 11724번 연결요소

ibelieveinme 2022. 5. 10. 11:14
728x90

[문제]

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주

www.acmicpc.net


[풀이]

벡터를 활용한 인접리스트와 DFS로 품~!

 

*동적할당부분 기억하깅...

vector<int> *graph = new vector<int>[vertexNum + 1]; //인접리스트 동적할당
bool *visited = new bool[vertexNum + 1];

 

[풀이 코드]

#include <iostream>
#include <vector>
using namespace std;

void dfs(int vertex, vector<int> graph[], bool *visited);

int main() {
    int vertexNum, edgeNum, u, v;
    cin >> vertexNum >> edgeNum;

    vector<int> *graph = new vector<int>[vertexNum + 1]; //인접리스트 동적할당
    bool *visited = new bool[vertexNum + 1];

    for (int i = 0; i < edgeNum; i++) {
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    for (int i = 0; i < vertexNum; i++) visited[i] = false;

    int count = 0;
    for (int i = 1; i <= vertexNum; i++) {
        if (!visited[i]) {
            dfs(i, graph, visited);
            count++;
        }
    }
    cout << count;

    delete[] visited;
    return 0;
}

void dfs(int vertex, vector<int> graph[], bool *visited) {
    visited[vertex] = true;
    for (int i = 0; i < graph[vertex].size(); i++) {
        if (!visited[graph[vertex][i]]) dfs(graph[vertex][i], graph, visited);
    }
}
728x90