algorithm - 给定一个圆上的图的节点,找到要删除的最小节点数以得到一个图,其中每个节点都有到其下一个节点的边

标签 algorithm

给定n个人坐在 table 旁,有些人彼此熟悉,熟悉度是双向关系,求从 table 上淘汰的最少人数,以得到 table 上的每个人都是熟悉它的邻居。给出 O(n^2) 的解

我目前的努力: 按照顺序,我尝试通过 T(n) = T(n-1) + O(n) 来解决问题, 但是如果我认为我已经找到了包含 m 个节点的理想圆,现在我想添加一个新节点,我检查新节点是否可以成为圆的新成员并创建 m+1 个节点的新圆,如果有可能问题就解决了,但如果没有,我确实需要存储所有长度为 m-1、m-2 的圆,...并将这个新节点添加到它们中,这需要超过 O(n)时间。

最佳答案

假设我们有一个 n 的图表节点,0 to n - 1 .

如果我们把问题看成寻找从节点A回到A的最短循环,节点a之间的距离和 b绝对不同(b - a - 1) (这是这两者之间的所有节点)我们只能从 a 开始至 b如果b > aa是起始节点。这个问题简化为寻找图中最短路径的经典问题。

使用 Dijkstra 算法,我们可以获得 O(N^2 log N) 算法。

Java代码:

class State{
    int node, distance;
}
int result = n - 1;
for(int i = 0; i < n; i++){
    //Find the shortest path to move from i -> i
    PriorityQueue<State> q = new PriorityQueue<>((a , b) -> Integer.compare(a.distance, b.distance));
    for(int j : map[i]) {
        if( j > i){
            q.add(new State(j , j - i + 1);
        }
    }  

    int[]dist = new int[n];
    Arrays.fill(dist, n - 1);
    while(!q.isEmpty()){
          State s = q.poll();
          if(s.distance != dist[s.node]){
               continue;
          }
          for(int j : map[s.node]){
               if((j > s.node || j == i) && dist[j] > s.distance + (j - s.node + 1)){
                    dist[j] = s.distance + (j - s.node + 1);
                    q.add(new State(j, dist[j]);
               }
          }
    }
    result = Integer.min(result, dist[i]);
}

关于algorithm - 给定一个圆上的图的节点,找到要删除的最小节点数以得到一个图,其中每个节点都有到其下一个节点的边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58618868/

相关文章:

python - 如何确定列表之间的差异?

algorithm - 用户匹配算法

python - 比较两个列表列表,每个元素列表的大小不相等

r - 如何将参数传递给 R 中的 mapply 函数?

algorithm - 线性搜索优化 - 减少计算次数

string - 如何计算 Jaro Winkler 距离中的 "m"?

mysql - 是否有一种算法可以将数字组合转换为一个数字?

java - 自定义二叉搜索树中的最短路径

c++ - std::unique 是否使 vector 迭代器无效?

c# - 欧拉计划问题 3 帮助