선행지식

그래프 탐색 (플로이드-워셜 알고리즘)

문제

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

접근방식 1 (bfs)

m 에서 시작해서 갈 수 있는 모든 경로를 g배열에 기록한다.

#include <bits/stdc++.h>
using namespace std;
int a[101][101]={},g[101][101]={},n,m=0;
bool v[101]={};
queue<int> bfsq;
void search(int x){
    if(v[x]){
        g[m][x]=1;
        return;
    }
    v[x]=true;
    for(int i=0; i<n; i++){
        if(a[x][i]==1){
            g[x][i]=1;
            g[m][i]=1;
            bfsq.push(i);
        }
    }while (!bfsq.empty()){
        x=bfsq.front();
        bfsq.pop();
        search(x);
    }
    return;
}
int main(){
    cin >> n;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> a[i][j];
        }
    }for(int i=0; i<n; i++){
        m=i;
        memset(v, false, 101*sizeof(bool));
        search(i);
    }for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << g[i][j] << ' ';
        }cout << '\n';
    }
}

태그에는 플로이드-워셜 알고리즘이 나오는데 이 알고리즘은 아직 잘 모른다.
나중에 알고리즘 복습하는 겸 다른 알고리즘과 정리해서 따로 올려야겠다.