알고리즘/BOJ 문제풀이

[Graph] BOJ 15562 네트워크

4Legs 2020. 12. 31. 22:45

문제 링크 : www.acmicpc.net/problem/15562

 

15562번: 네트워크

우리의 회사에는 N개의 네트워크 시스템 S1, S2, ..., SN와 이들을 연결하는 M개의 네트워크들 W1, W2, ..., WM이 있다. 네트워크 시스템들은 우선순위가 있어 모든 네트워크는 우선순위가

www.acmicpc.net

임의의 시스템 K에 대해 다음과 같은 경우를 생각해보자.

이 경우, 문제의 조건에 따라 네트워크를 정리하면 다음과 같다.

만약 K에서 B ~ F로 각각 나가는 간선이 하나씩 존재하더라도, 이 간선들은 모두 A에서 B ~ F로 나가는 간선으로 대체될 수 있다. 

즉, 한 노드를 기준으로 자신에게 들어오는 간선이 존재한다면, 자신에게서 나가는 간선들은 위의 A -> B와 같이 대체될 수 있다는 말이다.

다음과 같은 경우도 보자.

(A, A')가 K에 연결되어 있고, K는 (B, B', B'')와 연결되어 있다. 따라서 이 모든 간선들은 대체될 수 있는 간선이다.

하지만 만약 (A, A')를 모두 (B, B', B'')에 각각 연결하려 한다면 총 간선의 개수가 6이 되어, 오히려 네트워크의 수가 더 늘어나게 된다.

따라서, 네트워크를 다음과 같이 정리한다.

이처럼 정리 후 네트워크의 개수를 최소화하기 위해서는 자신에게로 들어오는 간선의 수만큼만 이어주어야 한다.

 

따라서 이 문제의 답은 다음과 같이 구할 수 있다.

"진출 차수(Outdegree)가 진입 차수(Indegree)보다 큰 모든 노드에 대해, Outdegree - Indegree의 총합"

 

[코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
typedef pair<intint> p;
 
int n, m, discard;
int indegree[1000001];
int outdegree[1000001];
 
void init() {
    int f, s;
    cin >> n >> m;
 
    for (int i = 0; i < m; i++) {
        cin >> f >> s;
        if (f < s) {
            outdegree[f]++;
            indegree[s]++;
        }
        else {
            outdegree[s]++;
            indegree[f]++;
        }
    }
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(NULL);
 
    int answer = 0;
    init();
    for (int i = 1; i <= n; i++) {
        if (outdegree[i] < indegree[i]) continue;
        answer += outdegree[i] - indegree[i];
    }
 
    printf("%d\n", answer);
 
    return 0;
}
cs

 

'알고리즘 > BOJ 문제풀이' 카테고리의 다른 글

[Graph] BOJ 3665 최종 순위  (2) 2021.01.04
[Graph] BOJ 11266 단절점  (1) 2021.01.01
[Greedy] BOJ 2437 저울  (0) 2020.12.29
[DP] BOJ 1029 그림 교환  (0) 2020.12.29
[Segtree] BOJ 7578 공장  (0) 2020.12.22