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#8012#한동이는영업사원
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#BOJ#12865#평범한배낭
- 백준#boj#16932#모양만들기
- 백준#BOJ#1939#중량제한
- 백준#boj#12755
- 백준#BOJ#2615#오목
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 21278 ] 호석이 두 마리 치킨 본문
문제 : n개의 정점과 m개의 간선이 주어집니다. 이때 2개의 정점을 선택하는데 모든 정점에서 선택한 2개의 정점 중 가까운 정점과의 거리가 최소가 되게끔 만드시오
해설 : n이 최대 100밖에 안된다는 것은 별짓거리를 다해도 된다는 뜻이죠. 100C2 로 정점을 선택해서 bfs를 돌려도 되고 플로이드-와샬 알고리즘을 사용해서 구해도 되고 등등
전 맘편하게 플로이드-와샬 알고리즘을 사용했습니다. 모든 정점과의 거리의 최소값을 구해준 다음에 정점을 선택해야되는데 조건에서 무조건 작은 번호가 우선순위를 가지니 그냥 for문 2개를 돌려서 구해주면 됩니다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct info {
int x, y, dis;
};
int n, m;
int adj[101][101],dist[101][101];
const int INF = (int)1e9;
int solve(int x, int y);
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int x, y;
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> x >> y;
adj[x][y] = adj[y][x] = 1;
}
for(int i=1;i<=n;i++)
for (int j = 1; j <= n; j++) {
if (i == j)continue;
else if (adj[i][j])
dist[i][j] = adj[i][j];
else
dist[i][j] = INF;
}
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]);
int ax,ay,ans = INF;
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++){
int ret = solve(i, j);
if (ans > ret) {
ax = i, ay = j;
ans = ret;
}
}
cout << ax<<" " << ay <<" "<< ans*2;
return 0;
}
int solve(int x, int y)
{
int distance = 0;
for (int i = 1; i <= n; i++)
distance += min(dist[x][i], dist[y][i]);
return distance;
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[ boj : 5557 ] 1학년 (0) | 2021.04.03 |
---|---|
[ boj : 2806 ] DNA 발견 (0) | 2021.03.31 |
[ boj : 1090 ] 체커 (0) | 2021.03.25 |
[ boj : 2357 ] 농구 골대 세우기 (1) | 2021.03.23 |
[ boj : 2121 ] 넷이 놀기 (0) | 2021.03.18 |