我看到了以下代码,用于制作图表并对其进行深度优先搜索。你能解释一下我在这里使用vector g吗?在第二个函数中,它是如何写成二维的东西。请为此目的使用向量清楚地解释整个过程。问题如下:---公司连接到编号从1到n的n个城市。目前公司总部位于指数hq1。每对连接的城市都是双向连接的。连接是这样的,从总部到每个城市只有一个连接。连接城市的地图按以下方式保存:对于每个城市,与总部不同,从总部到i的路上保留了最后一个城市的数字ci - 索引。
该公司决定将总部从城市hq1迁至城市hq2。因此,在此更改之后,如上所述的旧地图表示变得不正确。请帮助公司以上述方式找到新地图。
输入
第一行包含测试用例的数量(0 以下行包含n - 1个以空格分隔的整数 - 地图的旧表示形式。对于每个城市,除了hq1之外,还有从总部到城市i的最后一个城市的整数ci - 索引。所有城市都按照指数增加的顺序进行描述。 输出 输出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;
}
答案 0 :(得分:0)
可以通过[]
作为普通数组访问向量。 g
是一组int的向量,因此可以作为2D数组访问。它包含有关城市图表中边缘的信息,作为邻接列表
在第{x'个顶点的列表(向量)上的make_graph()
中,我推送一个,反之亦然,因为连接是双向的。
在第x个列表中每个相邻顶点dfs()
的{{1}}函数中,j
被标记为x
的父级,因为DFS从root(新HQ)开始)j
与x
相关联。
行j
阻止了DFS-ing父节点(仍然在他们孩子的列表中)。