使用C ++中的向量进行图形和深度优先搜索

时间:2013-08-23 09:04:52

标签: c++ search graph

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

1 个答案:

答案 0 :(得分:0)

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

Adjacency list example

在第{x'个顶点的列表(向量)上的make_graph()中,我推送一个,反之亦然,因为连接是双向的。

在第x个列表中每个相邻顶点dfs()的{​​{1}}函数中,j被标记为x的父级,因为DFS从root(新HQ)开始)jx相关联。

j阻止了DFS-ing父节点(仍然在他们孩子的列表中)。