땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • 이것이 리눅스다 with Rocky Linux9
  • E
  • D
  • I
  • ㅗ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 11403 경로찾기(DFS,BFS, Floyd-Warshall)

2022. 5. 4. 18:47

https://www.acmicpc.net/problem/11403

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

지금까지 만난 그래프 문제와는 조금 다른점은 방향그래프라는 것이다

 

탐색방법은 매우 다양하며 정점끼리 서로 이어진 것만 새로운 행렬에 체크해줘서 출력하면 되는 문제다

 

DFS

#DFS
#다차원배열 visited을 넘겨서 확인
#std행을 fix시켜놓고 처리를 해야하기 때문에 std 인자를 넣어줬다

def dfs(std, start):
    for i in range(n):
        if visited[std][i] == 0 and board[start][i]:
            visited[std][i] = 1
            dfs(std, i)

n = int(input())

board = [list(map(int,input().split())) for _ in range(n)]
visited = [[0] * n for _ in range(n)]

for i in range(n):
    dfs(i,i)

for i in visited:
    print(*i)
#DFS
#일차원배열 visited을 넘겨서 확인

def dfs(start):
    for i in range(n):
        if visited[i] == 0 and board[start][i]:
            visited[i] = 1
            dfs(i)

n = int(input())

board = [list(map(int,input().split())) for _ in range(n)]

visited = [0] * n
for i in range(n):
    dfs(i)
    print(*visited) #한 행씩 처리 하기
    visited = [0] * n

BFS

#bfs
from collections import deque

def bfs(start):
    queue = deque()
    queue.append(start)
    while queue:
        a = queue.popleft()
        for i in range(n):
            if not visited[start][i] and board[a][i]:
                queue.append(i)
                visited[start][i] = 1

n = int(input())

board = [list(map(int,input().split())) for _ in range(n)]

visited = [[0] * n for _ in range(n)]
for i in range(n):
    bfs(i)

for i in visited:
    print(*i)

Floyd-Warshall

i를 출발해 j로 바로 가는 것보다

i를 출발해 k를 거쳐 j로 가는 게 효율적일 경우(저렴할 경우) 해당 값을 갱신해주는 것이다

경로 k라 해서 하나의 정점 k만 거치는 것이 아니다

여러 정점을 거치는 모든 경우의 수가 포함되어 있다

#플로이드-워셜 O(n^3)

N = int(input())
graph = []
for _ in range(N):
    graph.append(list(map(int, input().split())))


for k in range(N):
    for i in range(N):
        for j in range(N):
            if graph[i][k] == 1 and graph[k][j] == 1:
                graph[i][j] = 1

for i in graph:
    print(*i)

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 5430 AC(Queue)  (0) 2022.05.06
백준 1107 리모콘(Brute-Force)  (0) 2022.05.04
프로그래머스 양궁대회(시뮬레이션, 그리디)  (0) 2022.04.14
프로그래머스 쿼드압축 후 개수 새기(분할 정복)  (0) 2022.04.14
백준 18243 Small World Network(플로이드-와샬, BFS)  (0) 2022.04.07
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 5430 AC(Queue)
    • 백준 1107 리모콘(Brute-Force)
    • 프로그래머스 양궁대회(시뮬레이션, 그리디)
    • 프로그래머스 쿼드압축 후 개수 새기(분할 정복)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바