Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 비트마스크
- SSAFY
- 백트래킹
- 크루스칼
- 우선순위 큐
- DP
- 분할 정복
- 재귀
- 빠른 입출력
- BFS
- 순열
- 이분 탐색
- 큐
- 문자열
- 중복 순열
- dfs
- 링크드리스트
- 완전 탐색
- 그리디
- 조합
- BeautifulSoup
- 피보나치 수
- 스택
- MST
- 클래스
- Knapsack
- lis
- 세그먼트 트리
- 시뮬레이션
- 메모리풀
Archives
- Today
- Total
작심 24/7
[백준] 11403번 경로 찾기 (C++, JAVA) 본문
11403번: 경로 찾기
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
www.acmicpc.net
모든 정점을 둘러보며 현재 정점이 가리키는 정점을 다시 현재 정점으로 삼는 방식으로
재귀로 DFS를 구현했다.
한 번 방문한 정점은 visited로 표시해준 후 다시는 방문하지 않도록 해주었다.
한 정점의 연결고리 검사가 모두 끝나면 visited를 0으로 다시 초기화해주고
그다음 정점의 연결고리들을 모두 검사해준다.
< C++ 코드 >
#include <iostream>
using namespace std;
void Dfs(int N, int idx, int graph[][101], int visited[]) {
for (int i = 0; i < N; i++) {
if (!visited[i] && graph[idx][i]) {
visited[i] = 1;
Dfs(N, i, graph, visited);
}
}
}
int main() {
int N;
cin >> N;
int graph[101][101] = { 0 };
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) cin >> graph[i][j];
for (int i = 0; i < N; i++) {
int visited[101] = { 0 };
Dfs(N, i, graph, visited);
for (int j = 0; j < N; j++) if (visited[j]) graph[i][j] = 1;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) cout << graph[i][j] << " ";
cout << "\n";
}
return 0;
}
< JAVA 코드 >
import java.util.Scanner;
public class BOJ_11403_경로찾기 {
private static int N;
private static int arr[][];
private static boolean visited[];
public static void dfs(int start, int x) {
for(int i = 0; i < N; i++) {
if(arr[x][i] == 1 && !visited[i]) {
arr[start][i] = 1;
visited[i] = true;
dfs(start, i);
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); arr = new int[N][N];
for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) arr[i][j] = sc.nextInt();
for(int i = 0; i < N; i++) {
visited = new boolean[N];
dfs(i, i);
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) System.out.print(arr[i][j] + " ");
System.out.println();
}
}
}
'백준' 카테고리의 다른 글
[백준] 2468번 안전 영역 (C++, JAVA) (0) | 2020.06.10 |
---|---|
[백준] 10026번 적록색약 (C++, JAVA) (0) | 2020.06.10 |
[백준] 2667번 단지 번호 붙이기 (C++, JAVA) (0) | 2020.06.10 |
[백준] 1743번 음식물 피하기 (0) | 2020.06.09 |
[백준] 11724번 연결 요소의 개수 (0) | 2020.06.09 |
Comments