N의 크기(N <=100)가 크지 않으므로 일일이 탐색해서 풀면 된다.

 

* 매번 한 개의 정점을 탐색할 때마다 visited 배열을 false로 초기화 후에 사용해야 한다.

 

 

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

vector<vector<int> > route;
bool visited[101];
int arr[101][101];
int N;

void dfs(int y) {
	int size = route[y].size();
	for (int i = 0; i < size; i++) {
		if (!visited[route[y][i]]) {
			visited[route[y][i]] = true;
			dfs(route[y][i]);
		}
	}
}

int main() {

	scanf("%d", &N);
	route.resize(N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			int temp;
			scanf("%d", &temp);
			arr[i][j] = temp;
			if (temp == 1) {
				route[i].push_back(j);
			}
		}
	}
	for (int i = 0; i < N; i++) {
		memset(visited, false, sizeof(bool) * N);
		dfs(i);
		for (int j = 0; j < N; j++) {
			if (visited[j]) {
				arr[i][j] = true;
			}
		}

	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}



	return 0;
}

 

'알고리즘' 카테고리의 다른 글

BOJ 9466번: 텀 프로젝트  (0) 2020.01.28
BOJ 10552번: DOM  (0) 2020.01.28

+ Recent posts