我看到以下代码用于制作图表并对其进行深度优先搜索。你能解释一下向量 g 的用法吗?在第二个函数中,它是如何写成二维的。请清楚地解释整个过程,关于为此目的使用向量。问题如下:--- 一家公司连接到从 1 到 n 编号的 n 个城市。目前公司总部位于指数hq1。每对相连的城市都是双向相连的。连接是这样的,从总部到每个城市只有一个连接。连接城市的地图保存方式如下:对于每个城市i,与总部不同,保存数字ci——从总部到i的路上最后一个城市的索引。
公司决定将总部从城市 hq1 搬到城市 hq2。因此,在此更改之后,上述地图的旧表示变得不正确。请帮助公司以上述方式找出新地图。
输入
第一行包含测试用例的数量(0 < T <= 10)。下一行包含三个空格分隔的整数 n, hq1, hq2 (2 ≤ n ≤ 2*10^4, 1 ≤ hq1 ≠ hq2 ≤ n)——连通城市数、旧总部索引和新总部索引, 分别。
以下行包含 n - 1 个空格分隔的整数——地图的旧表示。对于除 hq1 之外的每个城市,都有一个整数 ci——从总部到城市 i 的途中最后一个城市的索引。所有城市都按索引递增的顺序进行描述。
输出
输出 n - 1 个数字 — 以相同格式表示的新地图。解决方案如下。
vector < int >g[10005];
void make_graph()
{
int k = 1;
for (int i = 1; i <= n; i++)
{
if (i == h1)
continue;
int x;
cin >> x;
g[x].push_back (i);
g[i].push_back (x);
}
}
int visited[20004], parent[20004];
void dfs(int x)
{
visited[x] = 1;
for (int i = 0; i < g[x].size (); i++)
{
int j = g[x][i];
if (j == parent[x])
continue;
parent[j] = x;
dfs (j);
}
return;
}
int
main ()
{
int t;
cin >> t;
while (t--)
{
cin >> n >> h1 >> h2;
make_graph ();
dfs (h2);
for (int i = 1; i < n; i++)
{
if (i == h2)
continue;
cout << parent[i] << " ";
}
if (n != h2)
cout << parent[n] << endl;
else
cout << endl;
memset (parent, 0, sizeof (parent));
memset (visited, 0, sizeof (parent));
for (int i = 1; i <= n; i++)
g[i].clear ();
}
return 0;
}