일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring
- 백준
- 알고리즘
- 라인
- dfs
- 라인플러스
- 프로그래머스
- 머신러닝
- DP
- C++
- 프로그래밍언어론
- 릿코드
- 스타벅스
- 스프링 프레임워크
- 백트래킹
- BFS
- binary search
- leetcode
- C/C++
- 파이썬
- Java
- Spring Framework
- Python
- 모두를 위한 딥러닝
- 시애틀
- 딥러닝
- STL
- 다이나믹프로그래밍
- jvm
- 벤쿠버
- Today
- Total
케이스윔의 개발 블로그
[백준 알고리즘] 1260번 DFS와 BFS 본문
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력과 출력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 한 간선이 여러 번 주어질 수도 있는데, 간선이 하나만 있는 것으로 생각하면 된다. 입력으로 주어지는 간선은 양방향이다.
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
문제 출처: 백준 온라인 저지 https://www.acmicpc.net/problem/1260
풀이
DFS공부했던게 일주일 쯤 지난거같아서 둘다 복습해볼려고 푼다 벡터로 DFS구현한 그대로, 큐로 BFS구현한 그대로 짜면 풀릴거다
문제에서 정점 번호가 작은 것을 먼저 방문해야하니까 인접리스트를 sort해줘야한다 처음에 안해서 틀렸습니다 받았다 ㅠㅠ
코드
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
class Graph{
public:
vector<vector<int>> adj;
queue<int> Q;
vector<bool> visited;
int N;
Graph(int n){
N=n;
adj.resize(N);
visited.resize(N);
}
void init()
{
int i;
for(i=0; i<N; i++)
visited[i]=false;
}
void makeEdge(int u, int v)
{
adj[u].push_back(v);
adj[v].push_back(u);
}
void sortList(){
for(int i=0; i<N; i++)
sort(adj[i].begin(), adj[i].end());
}
void DFS(int i)
{
int j;
visited[i]=true;
printf("%d ", i);
for(j=0; j<adj[i].size(); j++)
{
if(visited[adj[i][j]] == false)
DFS(adj[i][j]);
}
}
void BFS(int i)
{
int j, next;
Q.push(i);
visited[i]=true;
while(Q.empty() !=true)
{
j = Q.front();
Q.pop();
printf("%d ", j);
for(next=0; next < adj[j].size(); next++)
{
if(visited[adj[j][next]] == false){
visited[adj[j][next]] = true;
Q.push(adj[j][next]);
}
}
}
}
};
int main()
{
int n, m, i;
int u, v, start;
scanf("%d %d %d", &n, &m, &start);
Graph G(n+1);
for(i=0;i<m; i++)
{
scanf("%d %d", &u, &v);
G.makeEdge(u, v);
}
G.sortList();
G.init();
G.DFS(start);
printf("\n");
G.init();
G.BFS(start);
return 0;
}
'Algorithm > DFS &BFS' 카테고리의 다른 글
[백준 알고리즘][BFS] 3055번 탈출 (0) | 2018.02.05 |
---|---|
[백준 알고리즘][BFS] 5427번 불, 4179번 불! (0) | 2018.01.24 |
[백준 알고리즘][BFS] 5014번 스타트링크 (0) | 2018.01.24 |
[백준 알고리즘][BFS] 7562번 나이트의 이동 (0) | 2018.01.24 |
[백준 알고리즘][BFS] 2178번 미로 탐색 (0) | 2018.01.22 |