문제
https://www.acmicpc.net/problem/1260
걸린 시간
-
풀이
C++
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stack>
#include <queue>
#define MAX 1001
using namespace std;
int N, M, V;
int adj_mat[MAX][MAX] = {0};
void dfs(){
int visited[MAX] = {0};
visited[V] = 1;
stack<int> s;
s.push(V);
printf("%d ", V);
int v; // vertex
while(s.size() != 0){
v = s.top();
s.pop();
if(!visited[v]){
visited[v] = 1;
printf("%d ", v);
}
// 작은 값이 먼저 pop 되도록 거꾸로 push
for(int w = N; w >= 1; w--){
if(adj_mat[v][w] && !visited[w]){
s.push(w);
}
}
}
printf("\n");
}
void bfs(){
int visited[MAX] = {0};
visited[V] = 1;
queue<int> q;
q.push(V);
printf("%d ", V);
int v; // vertex
while(q.size() != 0){
v = q.front();
q.pop();
if(!visited[v]){
visited[v] = 1;
printf("%d ", v);
}
for(int w = 1; w < N+1; w++){
if(adj_mat[v][w] && !visited[w]){
q.push(w);
}
}
}
printf("\n");
}
int main(){
scanf("%d %d %d", &N, &M, &V);
int T = M;
int s, e;
while((T--) != 0){
scanf("%d %d", &s, &e);
adj_mat[s][e] = 1;
adj_mat[e][s] = 1;
}
dfs();
bfs();
return 0;
}
정점의 번호가 1부터 시작하는 문제의 조건의 맞추어 인접행렬의 최대 크기를 1만큼 높이고 0행 0열은 사용하지 않았다. 입력받은 간선 정보에서 1씩 빼주어 사용해도 되는데 그냥 문제 조건대로 구현해보고 싶었다.
c++ 문법도 익히고 bfs, dfs 도 복습할 겸 풀어본 문제.
오랜만에 쓰는 c++ 적응하기 어려웠다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 7569번 토마토 (0) | 2020.08.17 |
---|---|
Baekjoon 9461번 파도반 수열 (0) | 2020.08.17 |
Baekjoon 11047번 동전 0 (0) | 2020.08.16 |
Baekjoon 6064번 카잉 달력 (0) | 2020.08.16 |
Baekjoon 2667번 단지번호붙이기 (0) | 2020.08.15 |
댓글