반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 11403 경로 찾기 본문

백준(Baekjoon) 문제

백준 11403 경로 찾기

huiung 2019. 2. 11. 14:05
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 정점 N개를 가지는 그래프의 인접 행렬을 입력 받고  정점 i에서 j로 갈 수 있는 경우가 있다면 1 그렇지 않다면 0으로 나타나는 행렬을 출력해야 합니다.

 

저는 이 문제를 bfs를 통해서 풀었습니다. i에서 j로 갈수 있는경우가 있는 경우 bfs 함수로 들어가서 visited[i][j] 를 1로 만들어주고 그후 j에서 다른 위치로 갈 수 있는지를 확인후 예를들어 j 에서 k로 갈 수 있다면 i -> j -> k 의 경로를 통해 i에서 k로 갈 수 있으므로 visited[i][k]를 1로 만들어 주는 식으로 i에서 어떤 다른 경로를 거쳐서 어떠한 경로로 갈 수 있는 모든 경우를 탐색하고 나온 뒤 또 다른 i에서 j로 갈 수 있는 경우를 동일한 방식으로 bfs를 통해서 찾았습니다.

 

다음은 코드입니다.

 

심심해서 dfs로도 한번 풀어봤습니다. dfs가 더 짧고 큐를 사용 안하니 더 효율적일 것 같습니다. 그리고 이 문제 같은 경우 방문 할 수 없는 0으로 표시된 지점들은 사실 필요가 없기 때문에 행렬로 모두 받는 것 보다 인접 리스트 형식으로 벡터 배열을 사용해 각 정점들이 갈 수 있는 점들을 저장해서 dfs나 bfs를 돌리는 것이 훨씬 효율적일것 같습니다..

 

 

 #include <iostream>
#include <queue>

using namespace std;

int adj[101][101];
int visited[101][101];
queue<pair<int, int>> q;
int N;

void bfs(int a, int b) {
	
	visited[a][b] = 1;
	q.push(make_pair(a, b));
	
	while(!q.empty()) {
		
		for(int i = 0; i < N; i++)
			if(adj[q.front().second][i] && !visited[a][i]) {
				visited[a][i] = 1;
				q.push(make_pair(q.front().second, i));
			}
		q.pop();
	}
}



int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> N; 
	
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++)
			cin >> adj[i][j];
			
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++)
			if(adj[i][j])
				bfs(i, j);
	
	for(int i = 0; i < N; i++){
		for(int j = 0; j < N; j++)
			cout<<visited[i][j] << ' ';
			cout<<'\n';
		}
	return 0;
}

 

#include <iostream>
#include <queue>

using namespace std;

int adj[101][101];
int visited[101][101];
queue<pair<int, int>> q;
int N;

void dfs(int a, int b) {
	
	visited[a][b] = 1;
		
	for(int i = 0; i < N; i++)
		if(adj[b][i] && !visited[a][i]) {
			dfs(a, i);
		}
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> N; 
	
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++)
			cin >> adj[i][j];
			
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++)
			if(adj[i][j])
				dfs(i, j);
	
	for(int i = 0; i < N; i++){
		for(int j = 0; j < N; j++)
			cout<<visited[i][j] << ' ';
			cout<<'\n';
		}
	return 0;
}

 

하는김에 벡터를 이용해 인접리스트 형식으로도 한번 구현을 해보았습니다. 다음은 코드입니다.

 

#include <iostream>
#include <vector>

using namespace std;

vector<int> v[101];
int visited[101][101];
int N;

void dfs(int a, int b) {
	
	visited[a][b] = 1;
		
	for(int i = 0; i < v[b].size(); i++)
		if(!visited[a][v[b][i]]) {
			dfs(a, v[b][i]);
		}
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> N; 
	
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++) {
			int x;
			cin >> x;
			if(x) {
				v[i].push_back(j);
			}
		}
			
	for(int i = 0; i < N; i++)
		for(int j = 0; j < v[i].size(); j++)
			dfs(i, v[i][j]);
	
	for(int i = 0; i < N; i++){
		for(int j = 0; j < N; j++)
			cout<<visited[i][j] << ' ';
			cout<<'\n';
		}
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 4179 불!  (0) 2019.02.13
백준 1847 스택 수열  (0) 2019.02.12
백준 2178 미로 탐색  (0) 2019.02.10
백준 5014 스타트링크  (0) 2019.02.10
백준 1012 유기농 배추  (0) 2019.02.10