알고리즘
70. 그래프 최단거리 [BFS]
홍루피
2021. 1. 28. 22:18
인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.
문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅
입력예제 1
6 9
1 3
1 4
2 1
2 5
3 4
4 5
4 6
6 2
6 5
출력예제 1
2 : 3
3 : 1
4 : 1
5 : 2
6 : 2
풀이
- 1번 정점부터 n번 정점까지 최소로 갈 수 있는 횟수를 찾는다(2~n번까지 출력)
- distance 배열을 사용하는것이 핵심
- 1번에서 출발하기 때문에 2번부터 구하면 된다. 1번은 미리 큐에 넣어놓고 ch[1]=1로 만든다
- x변수는 항상 큐의 front값을 가지고, x에 값을 담은 후에 큐에서 빠진다.
- x에서 한번에 갈 수 있는 연결 정점을 탐색한다 (연결리스트 형식이기 때문에 i는 0~map[x].size()까지 반복)
- 만약 ch[map[x][i]]==0이면 해당 체크를 1로 만들고 큐에 담아 준다.
- 해당 정점(map[x][i]의 값)의 dis 값을 x번째값(이미 거쳐온 정점의 거리값)에 1 더한 값으로 설정한다. => dis[x]+1
- 다음 사이클이 돌면 Q.front값은 처음 정점에서 이동한 정점값이 되고, 해당 정점에서 한번에 갈 수 있는 정점을 찾는 동일한 형식으로 진행된다.
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
int ch[30], dis[30];
//70. 그래프 최단거리(BFS)
int main(){
//1번 정점에서 각 정점으로 가는 최소 간선수 2번 정점부터(방향그래프)
int n, m, i, a, b, x; //n: 정점 수, m: 간선 수
vector<int> map[30];
queue<int> Q;
scanf("%d %d", &n, &m);
for(i= 1; i<=m; i++){
scanf("%d %d", &a, &b);
map[a].push_back(b);
}
Q.push(1);
ch[1]=1;
while(!Q.empty()){
x=Q.front();
Q.pop();
for(i=0;i<map[x].size();i++){
if(ch[map[x][i]]==0){
ch[map[x][i]]=1;
Q.push(map[x][i]);
dis[map[x][i]]=dis[x]+1;
}
}
}
for(i=2;i<=n;i++){
printf("%d : %d\n", i, dis[i]);
}
return 0;
}