我已经接受了以下练习:有一个没有加权,定向,弱连接的图,有n个节点(n <1 000 000)。我们想要从最少数量的节点开始遍历整个图形。问题是:我从哪个节点开始遍历?我找不到关于这个特定主题的任何内容。但是,我设法提出了一种算法,但效率不高:
x[i][...]
(x = List<List<int>>
)x[i].Count == n
(x[i] union x[j]).Count == n
(x[i] union x[j] union x[k]).Count == n
...所以我制作了所有可能的2个,3个,4个...... x子集的联合,并检查它的计数是否为n。如果n不是太高,它可以正常工作,但是对于更大的n,我需要一个更有效的算法。
感谢任何帮助(你会让我能够再次入睡)! :)
答案 0 :(得分:0)
查找没有任何传入边的节点。循环遍历这些节点,并为每个节点v开始遍历图形。记住您访问过的节点(通过将它们放入哈希表或标记它们)。到达已访问过的节点时停止遍历。
您需要一个邻接列表表示,其中每个节点都有一个传入列表和一个传出边列表。然后做这样的事情:
Set nodesToVisit = emptySet;
for i=1 to n:
if incoming[i].size() == 0:
nodesToVisit.add(i)
Set visited = emptySet;
for v in nodesToVisit:
nodesToVisit.remove(v)
if(v is not in visited):
visit(v);
visited.add(v);
for u in outgoing[v]:
nodesToVisit.add(u)