`
frank-liu
  • 浏览: 1682196 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Shortest path in complement graph

 
阅读更多

问题描述

      Shortest path in complement graph.:Given a graph G, design an algorithm to find the shortest path (number of edges) between s and every other vertex in the complement graph G'. The complement graph contains the same vertices as G but includes an edge v-w if and only if the edge v-w is not in G. Can you do any better than explicitly computing the complement graph G' and running BFS in G'?

问题分析

  这是一个 比较有意思的问题,它不是一个简单的BFS应用。里面还有一些稍微的变换。

  首先一个,对于一个图的complement graph来说,它是针对每个节点取所有原来和它不相邻的节点建立直接连接。比如说对如下的图来说:

  它对应的complement graph如下:

 

 

  所以这种转换就是针对每个节点将它原来的邻接边换成以前没有邻接的节点。不过,问题里要求计算这个complement graph的最短路径。所以一种办法就是我们根据一个图,先计算它的complement graph。然后再用BFS的方式来计算它的最短路径。这里假定图里的所有边都是一样的,没有特定的权值差别。 可是以这种办法计算的效率如何呢?对于每个节点,我们要对它的边重新计算一遍,所以每个节点的边构造时间就有V,所以光遍历这所有的V个节点它的总体时间复杂度就为V * V了。这里就超出了前面的期望结果。

  所以,这里需要做一个调整。我们可以继续利用BFS的方法,不过这里需要做一点调整。每次我们碰到一个节点的时候,要取它的非当前邻接节点作为后续的候选遍历节点,然后将这个节点加入到队列里。按照这个思路,我们可以得到如下的代码实现:

 

public class ComplementGraph {
	
	private boolean[] marked;
	private int[] distTo;
	private Set<Integer> set;
	public ComplementGraph(Graph g) {
		marked = new boolean[g.vertices()];
		distTo = new int[g.vertices()];
		for(int i = 0; i < g.vertices() i++) {
			distTo[i] = Integer.MAX_VALUE;
		}
	}

	public bfs(Graph g, int s) {
		Queue<Integer> queue = new LinkedList<>();
		marked[s] = true;
		distTo[s] = 0;
		queue.add(s);
		while(!queue.isEmpty()) {
			int e = queue.remove();
			List<Integer> list = makeComplement(set, g.adj(e));
			for(int i : list) {
				if(!marked[i]) {
					marked[i] = true;
					distTo[i] = distTo[e] + 1;
					queue.add(i);
				}
			}
		}
	}

	private List<Integer> makeComplement(Set<Integer> set, List<Integer> adj) {
		// make a complement list which is in set but not in adj
	}

}

  这里就是稍微增加了一个方法在每次遍历一个节点的时候先计算它的complement vertices。这样问题就解决了。 

 

 

参考材料

http://stackoverflow.com/questions/24476027/shortest-path-in-a-complement-graph-algorithm

 http://algs4.cs.princeton.edu/41graph/BreadthFirstPaths.java.html

  • 大小: 7.8 KB
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    Shortest path problem of uncertain random network

    The shortest path problem is one of the most fundamental problems in network optimization. This paper is concerned with shortest path problems in non-deterministic environment, in which some arcs have...

    matlab k shortest path

    "Matlab k Shortest Path" 是一个专门用于寻找图中具有最少成本的k条路径的工具。在这个项目中,我们可以看到四个核心文件:`kShortestPath.m`、`dijkstra.m`、`TestKShortestPath.m` 和 `license.txt`。 1. **...

    ShortestPath

    **标题:ShortestPath** **描述:**在计算机科学领域,单源最短路径问题是一个经典问题,旨在寻找网络图中从一个特定源节点到所有其他节点的最短路径。这里提到的“ShortestPath”是指应用了贪心算法Dijkstra(迪杰...

    Priority-Based Genetic Algorithm for Shortest Path Routing Problem in OSPF

    Priority-Based Genetic Algorithm for Shortest Path Routing Problem in OSPF 主要介绍了遗传算法求解最短路径问题中的基于优先级的编码。这种编码方式可以很有效地解决图的最短路径等问题。

    11 ShortestPath.rar

    本资源"11 ShortestPath.rar"显然是针对严蔚敏教授的经典教材《数据结构》中的相关内容,特别是关于最短路径算法的实现进行了深入探讨。在这里,我们将详细解析这个主题,并讨论一些相关的算法。 1. **数据结构基础...

    C++代码ShortestPath_Floyd

    Status ShortestPath_Floyd(Graph &G,Distance &D,Path &P,Number &N) {int i,j,k; int s,t; if(G.kind==DG||G.kind==UDG) return ERROR; for(j=0;j;j++) for(k=0;k;k++) {D[j][k]=G.arcs[j][k]; P[j][k][0]=j...

    ShortestPath_DIJ.rar_shortestpath

    这个名为"ShortestPath_DIJ.rar_shortestpath"的压缩包包含了一个实现迪杰斯特拉(Dijkstra)算法的源代码——ShortestPath_DIJ.cpp,以及一个可能是用来记录资源来源的文本文件——www.pudn.com.txt。 迪杰斯特拉...

    k shortest Path C++

    "K Shortest Path"(K条最短路径)是寻找图中两个顶点间多于一条最短路径的问题。这个任务通常用于在网络流量管理、交通规划以及分布式系统中。这里我们主要讨论如何用C++实现K Shortest Path算法。 首先,我们来看...

    有向图的最短路径 源代码 Dijkstra's Shortest Path Algorithm 使用min heap

    本代码 利用 Dijkstra's Shortest Path Algorithm 求解有向图的最短路径。 包括 图的构建,求解过程的,排序使用的最小堆 等所有的源代码,并包括测试用例。 是学习最小堆 和 Dijkstra's Shortest Path Algorithm ...

    校园导游路线最近计算.zip_shortest path graph_路线计算

    "shortest_path_graph"标签表明这个项目不仅实现了算法,还可能包含了图数据结构的实现。在Python中,可以使用`networkx`库来方便地处理图和路径计算。同时,为了优化搜索效率,可以考虑使用优先队列(如Python的`...

    Parallel Shortest Path Algorithms:最短路径并行算法.pdf

    "Parallel Shortest Path Algorithms:最短路径并行算法" Parallel Shortest Path Algorithms(最短路径并行算法)是计算机科学和信息技术领域中的一种重要算法。该算法旨在解决大规模图形的单源最短路径问题...

    ShortestPath.rar_shortestpath

    在给出的"ShortestPath.mexw64"文件中,实现的可能是MATLAB环境下的Dijkstra算法,其文件后缀".mexw64"表明这可能是一个编译后的MATLAB可执行文件,用于提高计算性能。这类文件通常是由MATLAB的MEX接口编译的C/C++...

    a shortest path approach to the multiple-vehicle routing problem

    a shortest path approach to the multiple-vehicle routing problem with split pick-ups

    spr.tar.gz_NS2 shortest path_ns2 最短路径_ns2 路由_shortest path ns2

    本资源“spr.tar.gz_NS2 shortest path_ns2 最短路径_ns2 路由_shortest path ns2”提供了一个实现最短路径路由的示例,对于学习和理解NS2以及路由算法具有重要意义。 首先,我们要了解什么是NS2。NS2是一个广泛...

    shortest path faster algorithm

    sqrt((x2-x0)^2+(y2-y0)^2)-sqrt((x1-x0)^2+(y1-y0)^2)=t

    Dijkstra_shortestpath_

    Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,主要用于解决单源最短路径问题。在这个MATLAB程序中,我们将会探讨如何应用Dijkstra算法来寻找图中从指定起点到其他所有节点的...

    The Shortest Path Problem

    在计算机科学和图论领域,最短路径问题(The Shortest Path Problem)是研究如何找到两个节点间路径长度最短的问题。这个问题不仅理论意义重大,在实际应用中也非常广泛,如网络路由、物流配送、城市规划等场景都有...

    ShortestPath_DIJ.rar_ShortestPath_DIJ_shortestPath_d_shortestpat

    《VC6.0环境下最短路径算法的实现与解析》 在计算机科学中,图算法是解决各种问题的重要工具,特别是在网络分析、路径规划等领域。本文将深入探讨如何在Visual C++ 6.0(简称VC6.0)环境下,通过编程实现图的数据...

    Shortestpath_dynamic.java

    关于最短路径的求法,是Java编写的,不知道用起来怎么样

Global site tag (gtag.js) - Google Analytics