前提・実現したいこと
Atcoderの競プロ典型90問の 003番の問題
https://atcoder.jp/contests/typical90/tasks/typical90_c
の模範解答
https://github.com/E869120/kyopro_educational_90/blob/main/sol/003.cpp
についての質問です.
質問すべき場所を間違っていたら申し訳ありません.
ソースコード12行目では
vector<int> G[1 << 18];
と1次元配列として宣言されていますが, 39, 40行目では
G[A[i]].push_back(B[i]); G[B[i]].push_back(A[i]);
と2次元配列に対する push_backを使用しています.
どうしてエラーが出ないんでしょうか?
該当のソースコード
#include <iostream> #include <vector> #include <queue> using namespace std; // 入力 int N; int A[1 << 18], B[1 << 18]; // グラフ const int INF = (1 << 29); vector<int> G[1 << 18]; int dist[1 << 18]; void getdist(int start) { // 幅優先探索(BFS)により、最短距離を計算 for (int i = 1; i <= N; i++) dist[i] = INF; queue<int> Q; Q.push(start); dist[start] = 0; while (!Q.empty()) { int pos = Q.front(); Q.pop(); for (int to : G[pos]) { if (dist[to] == INF) { dist[to] = dist[pos] + 1; Q.push(to); } } } } int main() { // Step #1. 入力 cin >> N; for (int i = 1; i <= N - 1; i++) { cin >> A[i] >> B[i]; G[A[i]].push_back(B[i]); G[B[i]].push_back(A[i]); } // Step #2. 頂点 1 からの最短距離を求める // maxid1: 頂点 1 から最も離れている(最短距離が長い)頂点 getdist(1); int maxn1 = -1, maxid1 = -1; for (int i = 1; i <= N; i++) { if (maxn1 < dist[i]) { maxn1 = dist[i]; maxid1 = i; } } // Step #3. 頂点 maxid1 からの最短距離を求める // maxn2: 木の直径(最短距離の最大値) getdist(maxid1); int maxn2 = -1; for (int i = 1; i <= N; i++) { maxn2 = max(maxn2, dist[i]); } // Step #4. 出力 cout << maxn2 + 1 << endl; return 0; }
試したこと
デバッグしてみても, Gは2次元配列となっていました.
G[2]の中に, G[2][0]や, G[2][1]があるわけですが, その容量は確保できていないように感じます.
vectorは可変長だから,
G[A[i]].push_back(B[i]); G[B[i]].push_back(A[i]);
のような処理を行えば, 勝手に容量を逐一確保してくれているのでしょうか?
補足質問
const int INF = (1 << 29);
は, 距離distが計算されていないことを示すための値だと思いますが, どうして INFという変数名になっていると思いますか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/16 06:41
2021/06/16 06:49 編集
2021/06/16 08:01 編集
2021/06/16 07:58
2021/06/16 08:02
2021/06/16 08:04 編集
2021/06/16 08:11
2021/06/16 08:12
2021/06/16 08:12
2021/06/16 08:45 編集
2021/06/16 11:23 編集
2021/06/16 16:21