夜間のメッセージ(23258)
1.問題リンク
夜の手紙
2.解答
ろ水条件解析
つまり、
dp
「
では
つまり.
VS
に表示されます.
始点と終点は
3.完全なコード
夜の手紙
2.解答
ろ水条件解析
2^1 + 2^2 + 2^3 + ... + 2^(c-1) < 2^c
が設立されました.つまり、
c
未満の番号の家だけを通らなければなりません.dp
「
dp[k][i][j]
はk
以下の家屋のみを通過し、i
からj
までの最小時間」と定義されています.では
dp[k][i][j]
の式はmin(dp[k - 1][i][j], dp[k - 1][i][k] + dp[k - 1][k][j]
です.つまり.
k - 1
以下の家屋しか通らず、iからjまでの最短時間VS
k - 1
以下の家屋のみを経て、iからkまでの最短時間+24579142以下の家屋、kからjまでの最短時間に表示されます.
始点と終点は
k - 1
なので、論理に背かない!3.完全なコード
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, q;
int d[301][301][301];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> d[0][i][j];
if (i != j && d[0][i][j] == 0) d[0][i][j] = INF;
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
d[k][i][j] = min(d[k - 1][i][j], d[k - 1][i][k] + d[k - 1][k][j]);
}
}
}
int c, s, e;
while (q--) {
cin >> c >> s >> e;
// c미만으로 거쳐야돼서 1을 빼준다.
cout << (d[c - 1][s][e] == INF ? -1 : d[c - 1][s][e]) << '\n';
}
return 0;
}
Reference
この問題について(夜間のメッセージ(23258)), 我々は、より多くの情報をここで見つけました https://velog.io/@front/백준-밤편지23258テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol