[적용한 알고리즘]
(굳이 꼽자면) 그래프, 행렬
[아이디어]
요약하면, A->B 까지 정확히 K번 거쳐서 갈 수 있느냐는 말이다.
행렬의 거듭제곱을 이용하면 구할 수 있다고 한다.
"행렬 A^k 에서 (i, j) 의 의미가 결국 i->j 까지 k 번만에 갈 수 있느냐?" 이므로,
행렬 거듭제곱 알고리즘만 짜면 된다.
[교훈]
내용
<코드>
#include <iostream>
#include <vector>
using namespace std;
typedef vector<vector<bool>> matrix;
matrix operator * (const matrix &a, const matrix &b){
int n = a.size();
matrix c(n, vector<bool>(n));
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
for (int k = 0; k < n; k++){
if (a[i][k] & b[k][j]){
c[i][j] = true;
}
}
}
}
return c;
}
matrix pow(matrix a, int M){
int N = a.size();
matrix ans(N, vector<bool>(N));
for (int i = 0; i < N; i++) ans[i][i] = true;
while (M > 0){
if (M % 2 == 1){
ans = ans * a;
}
a = a * a;
M /= 2;
}
return ans;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, K, M;
cin >> N >> K >> M;
matrix Game(N, vector<bool>(N));
for (int i = 0; i < N; i++){
int x, y;
cin >> x >> y;
Game[i][x - 1] = true;
Game[i][y - 1] = true;
}
matrix ans = pow(Game, K);
while (M--){
int x, y;
cin >> x >> y;
printf("%s\n", ans[x - 1][y - 1] ? "death" : "life");
}
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 1994번 등차수열 (2) | 2020.02.28 |
---|---|
[백준] 1647번 도시 분할 계획 (0) | 2020.02.03 |
[백준] 1613번 역사 (0) | 2020.02.01 |
[백준] 1854번 K번째 최단경로 찾기 (0) | 2020.02.01 |
[백준] 1507번 궁금한 민호 (0) | 2020.02.01 |