Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- mergesorttree
- Tree
- Math
- topologicalsort
- Dijkstra
- FenwickTree
- DP
- Sweeping
- KMP
- LCA
- BFS
- SlidingWindow
- scc
- Flow
- 2-sat
- ShortestPath
- BinarySearch
- Union-Find
- LIS
- MST
- TwoPointers
- ArticulationPoint
- IndexedTree
- Floyd
- DFS
- Implementation
- Bellman-Ford
- Bridge
- backtracking
- greedy
Archives
- Today
- Total
정리충의 정리노트
[백준] 1507: 궁금한 민호 본문
0. 문제 주소
https://www.acmicpc.net/problem/1507
1. 풀이
플로이드 워셜 알고리즘을 이용해서
i번 도시에서 j번 도시로 가는 최단거리가, 중간에 k번 도시를 거쳐서 가는 거리보다 클 경우 불가능,
같을 경우 i번 ~ j번을 직접적으로 잇는 도로는 필요가 없기 때문에 이를 저장해두고
순회가 끝나면 남은 도로들의 가중치만 더해주면 된다.
2. 풀이 코드
* 유의할 점
#include <bits/stdc++.h>
using namespace std;
int N;
int dist[22][22];
bool notused[22][22];
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
// ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
scanf("%d", &N);
for (int i=0;i<N;i++){
for (int j=0;j<N;j++){
scanf("%d", &dist[i][j]);
}
}
int ans = 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 || j==k || k==i) continue;
if (dist[i][k] + dist[k][j] == dist[i][j]){
notused[i][j]= true;
}
else if (dist[i][k] + dist[k][j] < dist[i][j]){
printf("-1");
return 0;
}
}
}
}
for (int i=0;i<N;i++){
for (int j=i;j<N;j++){
if (!notused[i][j]) ans += dist[i][j];
}
}
printf("%d\n", ans);
return 0;
}
'PS > ShortestPath' 카테고리의 다른 글
[백준] 10217: KCM Travel (0) | 2020.03.11 |
---|---|
[백준] 1162: 도로포장 (0) | 2020.03.10 |
[백준] 1948: 임계 경로 (수정) (0) | 2020.03.10 |
[백준] 9323: 무임승차 (0) | 2020.03.10 |
[백준] 2982: 국왕의 방문 (0) | 2020.03.07 |
Comments