일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 스타벅스
- 파이썬
- DP
- 다이나믹프로그래밍
- spring
- 릿코드
- jvm
- 알고리즘
- 백트래킹
- dfs
- C/C++
- 프로그래머스
- 벤쿠버
- 백준
- Python
- leetcode
- 라인
- Java
- STL
- 시애틀
- BFS
- 라인플러스
- 모두를 위한 딥러닝
- binary search
- C++
- 프로그래밍언어론
- 스프링 프레임워크
- 딥러닝
- Spring Framework
- 머신러닝
Archives
- Today
- Total
케이스윔의 개발 블로그
[C++] queue로 BFS 구현하기 본문
DFS는 vector로 구현도 해보고 문제도 몇개풀어봤으니 이제는 queue로 BFS를 구현해보려한다 DFS는 한 우물만 계속해서 파니까 쭉쭉 들어가기위해서 스택이 필요했고, BFS는 짧게짧게 갈 수 있는 모든 곳을 들러야하니까 FIFO(선입선출)인 큐가 필요하다
1. queue의 사용
- #include<queue>을 해줘야한다
- queue<int> Q; : int형으로 Q라는 이름의 큐 선언
- Q.push(값) : 해당값을 큐 Q에 넣는다
- Q.pop() : 큐 Q의 front를 삭제한다
- Q.front() : 큐의 제일 앞 값을 리턴한다(삭제되지않음)
- Q.back() : 큐의 제일 마지막 값을 리턴한다(삭제되지않음)
- Q.size() : 큐 Q의 원소 개수를 리턴한다
- Q.empty() : 큐가 비어있는지를 확인한다. 비어있으면 1 비어있지않으면 0을 리턴
2. queue로 BFS 구현하기
일단.. BFS에 대해서 다시 생각해보면 길게 쭉 들어가는게 아니라 짧게짧게 한곳한곳을 거쳐가는 방식이다
만약 vertex 1에서 2, 3을 갈 수 있다고 하면 1이 큐에 들어간다음 pop되면서 갈 수 있는 2, 3이 큐에 들어간다 하나의 vertex가 큐에서 pop되면서 그 정점에서 갈 수 있는 곳들이 push되면 된다 아 그래프를 표현해야하니까 인접리스트를 만들기 위해 vector도 필요하겠구나
- 코드
#include<stdio.h>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
class Graph{
public:
vector<vector<int>> adj;
queue<int> Q;
int N;
Graph(){}
Graph(int n)
{
N = n;
adj.resize(n);
}
void makeEdge(int u, int v)
{
adj[u].push_back(v);
adj[v].push_back(u);
}
void BFS()
{
vector<bool> visited(N, false);
Q.push(0); //0에서 시작한다고 가정(모든 vertex가 연결되어있다면)
visited[0]=true;
vector<int>::const_iterator next;
while(Q.empty()!=true)
{
int curr = Q.front();
Q.pop();
printf("%d ", curr);
for(next=adj[curr].begin() ; next !=adj[curr].end() ; next++)
{
if(visited[*next]!=true){
visited[*next]=true;
Q.push(*next);
}
}
}
}
};
int main()
{
int i;
int n, e, u, v;
scanf("%d %d", &n, &e);
Graph G(n);
for(i=0; i<e; i++)
{
scanf("%d %d", &u, &v);
G.makeEdge(u, v);
}
G.BFS();
}
'Study > C&C++' 카테고리의 다른 글
[C++] 입출력하기 (0) | 2018.05.15 |
---|---|
[C++] Pair 클래스 사용하기 (0) | 2018.03.07 |
[C++] STL 우선순위 큐(priority queue) (0) | 2018.03.05 |
[C/C++] long long 형식 (0) | 2018.01.04 |
[C/C++] min, max 함수 (0) | 2018.01.02 |
Comments