0

我看到以下代码用于制作图表并对其进行深度优先搜索。你能解释一下向量 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;
  }
4

1 回答 1

0

向量可以[]作为普通数组访问。g是一个整数向量数组,因此可以作为二维数组访问。它包含有关城市图中边缘的信息,作为邻接列表

邻接表示例

make_graph()第 x 个顶点的列表(向量)中,第 i 个被推送,反之亦然,因为连接是双向的。

在函数中,对于第 x个列表上dfs()的每个相邻顶点,都将其标记为'父级,因为 DFS 从根(新 HQ)开始并与 连接。jxjxj

Lineif (j == parent[x])防止 DFS-ing 父节点(它们仍然在其子列表中)。

于 2013-08-23T10:47:22.697 回答