무방향 그래프에서 모든 정점이 서로 얼마만큼 가까운지(최단경로)를 계산하는 문제이다.
모든 정점에 대해 각각 최단경로를 구해도 되지만,(다익스트라라면 O(V(E+VlogV))) 문제에서 조건이 2 ≤ N ≤ 100 이므로 플로이드 와샬 알고리즘O(V3)을 사용해도 충분하고 소스가 깔끔하다.
소스 첨부
#include <cstdio>
#define INF 987654321
inline int min(int a, int b){return a<b?a:b;}
int main(){
int i, j, k, n, m;
int c[101][101];
scanf("%d %d", &n, &m);
for(i=0; i<n; ++i)
for(j=0; j<n; ++j)
c[i][j] = i==j?0:INF;
for(i=0; i<m; ++i){
int a, b;
scanf("%d %d", &a, &b);
c[a-1][b-1] = c[b-1][a-1] = 1;
}
for(k=0; k<n; ++k){
for(i=0; i<n; ++i){
for(j=0; j<n; ++j){
if(c[i][k]+c[k][j] < c[i][j])
c[i][j] = c[i][k]+c[k][j];
}
}
}
int maxT = INF, thatPerson = 0;
for(i=0; i<n; ++i){
int bacon = 0;
for(j=0; j<n; ++j)
bacon += c[i][j]<INF?c[i][j]:0;
if(bacon < maxT){
maxT = bacon;
thatPerson = i+1;
}
}
printf("%d", thatPerson);
return 0;
}
댓글 없음:
댓글 쓰기