문제
https://www.acmicpc.net/problem/1389
걸린 시간
01 : 20 : 15
풀이
C++
#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <algorithm>
#define MAX 101
using namespace std;
int bfs(int adj_mat[][MAX], int i, int j){
queue<pair<int, int>> q;
q.push(make_pair(i, 0));
pair<int, int> tmp;
int v, l;
int visited[MAX] = {0};
visited[i] = 1;
while(!q.empty()){
tmp = q.front();
v = tmp.first; // value
l = tmp.second; // length
q.pop();
l += 1;
if(v == j)
break;
for(int w = 0; w < MAX; w++){
if(!visited[w] && adj_mat[v][w]){
q.push(make_pair(w, l));
}
}
}
return l-1;
}
int main(){
int N, M;
scanf("%d %d", &N, &M);
int adj_mat[MAX][MAX] = {0};
int A, B;
while(M--){
scanf("%d %d", &A, &B);
adj_mat[A][B] = 1;
adj_mat[B][A] = 1;
}
map<int, vector<int>> m;
vector<int> tmp;
int acc;
for(int i = 1; i < N+1; i++){ // 비교할 정점
acc = 0;
for(int j = 1; j < N+1; j++){ // 나머지 정점
acc += bfs(adj_mat, i, j);
}
if(m.find(acc) == m.end()){
tmp = {};
tmp.push_back(i);
m.insert(make_pair(acc, tmp));
}
else{
m[acc].push_back(i);
}
}
printf("%d\n", m.begin()->second[0]);
return 0;
}
기본적인 그래프 탐색 문제로 인접행렬과 bfs 를 사용해 풀이했다.
문제 중간에 디버깅을 위한 printf 문 한줄 때문에 맞는 정답임에도 틀렸습니다가 출력되어 한참을 다시 검토했다...
다른 풀이
C++
#include <bits/stdc++.h>
#define INF 987654321
using namespace std;
int n, m;
int adj[101][101];
vector<pair<int, int>> result;
void floyd(){
for(int i = 1; i <= n; i++)
adj[i][i] = 0;
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
adj[i][j] = INF;
int a, b;
for(int i = 0; i < m; i++){
cin >> a >> b;
adj[a][b] = 1;
adj[b][a] = 1;
}
floyd();
for(int i = 1; i <= n; i++){
int val = 0;
for(int j = 1; j <= n; j++)
val += adj[i][j];
result.push_back(make_pair(val, i));
}
sort(result.begin(), result.end());
cout << result[0].second;
return 0;
}
모든 정점 쌍의 최단거리를 간단히 구할 수 있는 플로이드 와샬(Floyd Warshall) 알고리즘을 이용한 풀이이다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 11003 최솟값 찾기 (0) | 2020.08.21 |
---|---|
Baekjoon 19572번 가뭄(Small) (0) | 2020.08.18 |
Baekjoon 7569번 토마토 (0) | 2020.08.17 |
Baekjoon 9461번 파도반 수열 (0) | 2020.08.17 |
Baekjoon 1260번 DFS와 BFS (0) | 2020.08.17 |
댓글