C++中重新排序路线以使所有路径通向城市零


假设有n个不同的城市,编号从0到n-1,并且有n-1条道路,使得两个不同城市之间只有一条路径。假设交通部决定将道路单向通行,因为道路太窄了。

这里道路由连接表示,其中connections[i] = [a, b]表示从城市a到城市b的一条道路。

如果首都(编号为0的城市)发生重大事件,许多人想前往该城市。我们必须对某些道路进行重新定向,以便每个城市都能到达城市0。我们必须找到需要更改的最小边数。

因此,如果输入是6,connections = [[0,1],[1,3],[2,3],[4,0],[4,5]],

则输出为3,因为我们必须更改红色所示边的方向,以便每个节点都能到达首都。

为了解决这个问题,我们将遵循以下步骤:

  • 定义两个大小为N = 5*10^4 + 5的列表数组graph1、graph2。

  • 从主方法执行以下操作:

  • 定义一个map in

  • 对于每个元素it in e,执行:

    • 将it[1]插入到graph1[it[0]]的末尾

    • 将it[0]插入到graph2[it[1]]的末尾

  • 定义一个大小为n的数组dist,并将其填充为N + 10

  • ret := 0, in[0] := 0, dist[0] := 0

  • 定义一个队列q

  • 将0插入到q中

  • 定义一个集合visited

  • 将0插入到visited中

  • 当(q不为空)时,执行:

    • node := q的第一个元素

    • 从q中删除元素

    • ret := ret + dist[node]

    • 对于每个元素it in graph2[node],执行:

      • 如果it未被访问且dist[it] > 0,则:

        • dist[it] := 0

        • 将it插入到q中

        • 将it插入到visited中

    • 对于每个元素it in graph1[node],执行:

      • 如果it未被访问且dist[it] > 1,则:

        • dist[it] := 1

        • 将it插入到q中

        • 将it插入到visited中

  • 返回ret

示例

让我们看看下面的实现,以便更好地理解:

在线演示

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
class Solution {
public:
   vector<int> graph1[N];
   vector<int> graph2[N];
   int minReorder(int n, vector<vector<int> >& e){
      map<int, int> in;
      for (auto& it : e) {
         graph1[it[0]].push_back(it[1]);
         graph2[it[1]].push_back(it[0]);
      }
      vector<int> dist(n, N + 10);
      int ret = 0;
      in[0] = 0;
      dist[0] = 0;
      queue<int> q;
      q.push(0);
      set<int> visited;
      visited.insert(0);
      while (!q.empty()) {
         int node = q.front();
         q.pop();
         ret += dist[node];
         for (auto& it : graph2[node]) {
            if (!visited.count(it) && dist[it] > 0) {
               dist[it] = 0;
               q.push(it);
               visited.insert(it);
            }
         }
         for (auto& it : graph1[node]) {
            if (!visited.count(it) && dist[it] > 1) {
               dist[it] = 1;
               q.push(it);
               visited.insert(it);
            }
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{0,1},{1,3},{2,3},{4,0},{4,5}};
   cout << (ob.minReorder(6,v));
}

输入

6,{{0,1},{1,3},{2,3},{4,0},{4,5}}

输出

3

更新于:2020年11月18日

397 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告