250x250
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 | 31 |
Tags
- 백준#boj#16932#모양만들기
- 백준#BOJ#1939#중량제한
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#2615#오목
- 백준#boj#12755
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 1504 ] 특정한 최단 경로 본문
문제 : 그래프와 간선이 주어지고 꼭 거쳐야 할 두 정점이 주어질때 1->N 까지의 최단거리를 구해라
해설 : n=800이니 그냥 플로이드-와샬 알고리즘을 사용해서 구해줬습니다.
꼭 거쳐야 할 정점이 a,b 라면
min(1->a->b->N,1->b->a->N) 이 답이 되겠죠. 도달할 수 없는 부분을 따로 예외처리 해주시고요.
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int n, m;
ll adj[801][801], dist[801][801];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll a, b, c;
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
adj[a][b] = adj[b][a] = c;
}
cin >> a >> b;
for(int i=1;i<=n;i++)
for (int j = 1; j <= n; j++)
{
if (i == j)adj[i][j] = 0;
else if (adj[i][j])dist[i][j] = adj[i][j];
else dist[i][j] = (int)1e9;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
ll x = min(dist[1][a] + dist[a][b] + dist[b][n], dist[1][b] + dist[b][a] + dist[a][n]);
if (x >= (ll)1e9)cout << -1;
else cout << x;
return 0;
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[ boj : 16936 ] 나3곱2 (0) | 2021.03.05 |
---|---|
[ boj : 14256 ] SSR (0) | 2021.02.28 |
[ boj : 1407 ] 2로 몇 번 나누어질까 (0) | 2021.02.21 |
[ boj : 10246 ] 부동산 경매 (0) | 2021.02.19 |
[ boj : 20168,20182,20183 ] 골목 대장 호석 - 기능성,효율성1,효율성2 (0) | 2021.02.14 |