코테 준비-문제풀기

1260 DFS BFS

FireStone 2019. 5. 29. 03:30

벡터를 사용해 인접리스트를 해볼까 했지만

나중에 비교하거나 할때 인접행렬이 편할 것 같아서 인접행렬로 풀어보겠음

밑에는 C++ 2차원배열 동적할당 하는 방법

 


알고리즘보다 배열때문에 힘들ㅇㅓㅆ음

이지윤이 동적할당하는거 도와줘서 어찌어찌 함

#include <iostream>
#include <stack>
#include <string.h>
#include <queue>

using namespace std;
int **arr;
int *visit;
void dfs(int start, int size_arr_num, bool flag) {

	stack<int> st;

	visit = new int[size_arr_num];
	memset(visit, 0, sizeof(int)*(size_arr_num));

	st.push(start);
	visit[start] = 1;
	cout << start << " ";

	while (!st.empty()) {
		int peek = st.top();
		flag = false;
		for (int i = 1;i <= size_arr_num;i++) {
			if (arr[peek][i] == 1 && visit[i]==0) {  //방문하지 않은걸 들려야하니까
				st.push(i);
				cout << i << " ";
				flag = true;
				visit[i] = 1;
				break;
			}
		}
		if (!flag)
			st.pop();
	}

}
void bfs(int start, int size_arr_num) {
	queue<int> que;
	memset(visit, 0, sizeof(int)*(size_arr_num));
	
	que.push(start);
	visit[start] = 1;
	while (!que.empty()) {
		int peek = que.front(); //front쓰면 나오지는 않아서 peek 역할이고 우리는 poll을 해야하니까 pop
		que.pop();
		cout <<peek << " ";
		for (int i = 1;i <= size_arr_num;i++) {
			if (arr[peek][i] == 1 && visit[i] == 0) {
				que.push(i);
				visit[i] = 1;
			}
		}

	}

}
int main(void) {
	int node_num = 0;
	int line_num = 0;
	int start_num = 0;
	int v1, v2 = 0;
	bool flag_m = true;

	cin >> node_num >> line_num >> start_num;

	int node_num_s = node_num + 2;
	arr = new int*[node_num_s];          //2차원 배열 동적할당 방법 -1이게 첫부분
	for (int i = 0;i < (node_num + 2);i++) {
		arr[i] = new int[node_num_s];    //-2 이게 두번째 배열 부분
		memset(arr[i], 0, sizeof(int)*(node_num_s));
		//memset으로 초기화하는법
	}
	
	for (int i = 0;i < line_num;i++) {
		cin >> v1 >> v2;
		arr[v1][v2] = 1;
		arr[v2][v1] = 1;
	}
	dfs(start_num,node_num_s,flag_m); //배열은 0부터 시작하니까 넘겨줄땐 계산 편하게 할려고 -1해줌
	cout << endl;
	bfs(start_num, node_num_s);
	//동적할당 해제
	for (int i = 0;i < node_num + 1;i++) {
		delete[]arr[i];
	}
	delete[]visit;
	return 0;
	
}

런타임에러는 배열때문에 났던것 같다.

이 예제가 배열이 1부터 시작해서 그것때문에 배열 크기 설정하는게 중간에 잘못된것 같음

무튼 고쳐서 맞았다

행복ㅎ

+++추가 수정(달라진건 별로 없지만..다시 풀어봄)

#include <stdio.h>
#include <iostream>
#include<cstring>
#include<stack>
#include<queue>

using namespace std;
int **arr;
int *visit;
void dfs(int start_num, int size){
    stack<int> st;
    int top;
    bool flag=false;
    int st_size=0;
    visit=new int[size];
    memset(visit,0,sizeof(int)*size);
    
    visit[start_num]=1;
    st.push(start_num);
    cout<<start_num+1<<" ";
    
    while(!st.empty()){
        top=st.top();
        flag=false;
        for(int i=0;i<size-1;i++){
            if(arr[top][i]==1&&visit[i]==0){
                st.push(i);
                cout<<i+1<<" ";
                visit[i]=1;
                st_size++;
                flag=true;
                break;
            }
        }
        //밑에까지 가고 없으면 다시 돌아와서 그 노드에서 dfs를 시작해야 하니까
        if(!flag)
            st.pop();
        
    }
    
}
void bfs(int start, int size){
    queue<int> que;
    int front;
    memset(visit,0,sizeof(int)*size);
    que.push(start);
    visit[start]=1;
    
    while(!que.empty()){
        front=que.front();
        cout<<front+1<<" ";
        que.pop();
        for(int i=0;i<size-1;i++){
            if(visit[i]==0&&arr[front][i]==1){
                //que에 bfs탐색과정대로 노드가 들어간다.
                que.push(i);
                visit[i]=1;
            }
            
        }
    }
    
}
int main()
{
    int n;
    int m;
    int start_num;
    int arr_size;
    int v1,v2;
    
    cin>>n>>m>>start_num;
    arr_size=n+1;
    arr=new int*[arr_size];
    for(int i=0;i<n;i++){
        arr[i]=new int[arr_size];
        memset(arr[i],0,sizeof(int)*(n));
    }

    for(int i=0;i<m;i++){
        cin>>v1>>v2;
        arr[v1-1][v2-1]=1;
        arr[v2-1][v1-1]=1;
    }
    
    dfs(start_num-1,arr_size);
    cout<<endl;
    bfs(start_num-1,arr_size);

for(int i=0;i<arr_size;i++){
    delete[]arr[i];
}
    return 0;
}

'코테 준비-문제풀기' 카테고리의 다른 글

백준 7785  (0) 2019.09.18
2193 Dynamic -이친수 구하기  (0) 2019.06.02
11399 greedy  (0) 2019.05.23
백준 dynamic programming 7579 번  (0) 2019.05.12
백준 다이나믹 9095번  (2) 2019.05.11