[英]Find Center of Directed Graph
我正在尝试使用 JavaScript 构建有向图,其中有 N + 1 个顶点(点)(编号从 0 到 N)和它们之间的 N 个有向边。 图网络是连通的; 也就是说,忽略边的方向,每对顶点之间都有一个链接。
我需要找到可以从图形上的所有顶点到达的中心顶点,或者确定它不存在。 顶点由 N 个整数的两个 arrays A 和 B 描述。 对于每个 integer K (0 <= K < N),从顶点 A[K] 到顶点 B[K] 存在一条边。
function 将采用以下格式:
function solution(A, B);
也就是说,给定两个 arrays A 和 B,返回作为中心的顶点的编号(可以从所有其他顶点到达的顶点)。 如果不存在这样的顶点,则 function 应返回 -1。
给定 A = [1,2,3] 和 B = [0,0,0],function 应返回 0。图中中心的数字为 0。
给定 A = [0,1,2,4,5] 和 B = [2,3,3,3,2],function 应该返回 3。图中的中心是数字 3。 从点 1,2 和 4 直接连接到点 3。从点 0 和 5,边缘通过点 2 到点 3 go。
中心顶点的出度必须为 0 。 我觉得这句话需要一些数学证明,所以在这里:
假设顶点
c
是中心。 假设从c
到另一个顶点d
有一条边。 给定中心的定义,必须有一条从d
到c
的路径,因此必须有一个环,并且具有N + 1
个顶点和N
条边的连通图是一棵树的教科书定义,它不包含环,所以这种以c
为原点的边不能存在。
显然,所有其他顶点的出度必须大于 0(因为它们必须以某种方式到达c
)。
知道了这一点,您可以解决O(n)中的问题。
只需搜索出度为 0 的单个顶点。如果它不存在或者您找到多个,则没有答案,否则答案是您找到的唯一值。
一个可能的解决方案是:
function solution(A, B){
var set = new Set();
for(var i = 0; i <= N; i++) set.add(i);
for(var i = 0; i < A.length; i++) set.delete(A[i]);
if(set.size != 1) console.log("There is no answer");
else console.log("The answer is " + set.values().next().value);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.