문제링크: https://www.acmicpc.net/problem/1507

 

1507번: 궁금한 민호

강호는 N개의 도시로 이루어진 나라에 살고 있다. 각 도시는 M개의 도로로 연결되어 있으며, 각 도로를 지날 때 필요한 시간이 존재한다. 도로는 잘 연결되어 있기 때문에, 도시 A에서 B로 이동할 수 없는 경우는 존재하지 않는다. 도시 A에서 도시 B로 바로 갈 수 있는 도로가 있거나, 다른 도시를 거쳐서 갈 수 있을 때, 도시 A에서 B를 갈 수 있다고 한다. 강호는 모든 쌍의 도시에 대해서 최소 이동 시간을 구해놓았다. 민호는 이 표를 보고 원래 도로

www.acmicpc.net

 

 

 

 문제 설명 

 

1. 도시의 개수와 각가의 도시사이에 이동하는데 필요한 시간이 주어짐.

2. 필요 없는 도로는 지우고 필요한 최소 도로의 길이를 출력.

 

 알고 리즘 

 

1. 플로이드 알고리즘을 이용해 지워도 되는 도로를 찾아서 지운다.

 

2. 지워도 되는지 여부를 확인하는  알고리즘은 다른 도시를 경유한 시간과 경유하지 않은 시간이 같은경우 경유안한

   경우를 지운다. 

   if (map[i][j] == map[i][k] + map[k][j])del[i][j] = 1;

 

3. 입력된 최소시간이 잘못입력된 경우에 -1을 출력.

 

 

 코 드 

 

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
46
47
48
49
50
51
#include<iostream>
#include<algorithm>
 
using namespace std;
 
int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
 
 
    int N, map[22][22],del[22][22];
    cin >> N;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> map[i][j];
            del[i][j] = 0;
        }
    }
    //플로이드
    for (int k = 0; k < N; k++) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
 
                if (i == j || i == k || j == k)continue;
                //지워도 되는 거
                if (map[i][j] == map[i][k] + map[k][j])del[i][j] = 1;
                //모순일경우 -1출력후 종료.
                else if (map[i][j] > map[i][k] + map[k][j]) {
                    cout << -1;
                    return 0;
                }
            }
        }
    }
 
    int result = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (del[i][j] == 1)map[i][j] = 0;            
        }        
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            result += map[i][j];                
        }
    }
    cout << result / 2;
 
}
 
cs

'c++ > 백준' 카테고리의 다른 글

백준 2004번 : 조합 0의 갯수  (0) 2020.04.30
백준 2458번 : 키 순서  (0) 2020.04.30
백준 11404 번 : 플로이드  (0) 2020.04.29
백준 3015번 : 오아시스 재결합  (0) 2020.04.29
백준 1613번: 역사  (0) 2020.04.29
ariz1623