ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 9372] 상근이의 여행
    백준/그래프 이론 2023. 9. 16. 10:41

    사실 이 문제는 알고리즘이 필요가 없다.

     

    모든 가중치는 1이라 봐도 무방하고 

    모든 국가를 여행하기 위한 비행기 종료의 최소 개수 == 간선 수 이므로

    최소신장트리의 간선수는 정점개수 N -1이므로 답이 그냥 N-1이다.

     


    #include <iostream>
    #include <vector>
    
    #define SIZE 1001
    
    using namespace std;
    
    int T, N, M;
    vector<pair<int,int>> arr;
    int parent[SIZE];
    
    // 최소 스패닝 트리
    // 모든 간선의 가중치가 1이므로 정렬필요없음
    int findParent(int node) {
    	// 자기자신이 부모노드이면
    	if (parent[node] == node) return node;
    	// 자기자신이 부모노드가 아니면
    	// 자신의 부모를 찾고 그걸로 자신의 부모값을 최신화 시켜주면서 반환
    	else return parent[node] = findParent(parent[node]);
    }
    
    void updateParent(int a,int b) {
    	a = findParent(a);
    	b = findParent(b);
    
    	if(a!=b) parent[b] = a;
    }
    
    bool isCycle(int a, int b) {
    	a = findParent(a);
    	b = findParent(b);
    
    	return a == b;
    }
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	cin >> T;
    
    	for (int i = 0; i < T; i++) {
    		arr.clear();
    		
    		cin >> N >> M;
    		int a, b;
    		// 비행기 종류
    		for (int k = 0; k < M; k++) {
    			cin >> a >> b;
    			arr.push_back(make_pair(a, b));
    		}
    
    		// parent배열 최신화
    		for (int k = 1; k <= N; k++) parent[k] = k;
    
    		// 간선 수
    		int cnt = 0;
    		for (int k = 0; k < M; k++) {
    			a = arr[k].first;
    			b = arr[k].second;
    
    			// a와 b가 사이클이 아니면 추가해주기
    			if (!isCycle(a, b)) {
    				cnt++;
    				updateParent(a, b);
    			}
    		}
    
    		cout << cnt << "\n";
    	}
    
    	return 0;
    }

    '백준 > 그래프 이론' 카테고리의 다른 글

    [백준 1647] 도시 분할 계획  (1) 2023.09.16
    [백준 1197] 최소 스패닝 트리  (0) 2023.09.16
    [백준 1717] 집합의 표현  (0) 2023.07.22
    [백준 16437] 양 구출 작전  (0) 2023.06.30
    [백준 11725] 트리의 부모 찾기  (0) 2023.06.30