【发布时间】:2015-12-31 02:59:29
【问题描述】:
我正在编写一个模型,其中:
节点表示为长度为 10 的位向量,每个位向量代表一些分子,边可以将源中存在的任何分子带到目标节点。
例如
S_Node : 0b0100000011 // 分子 0 , 1 , 8 出现在节点上
One_Edge : 0b0000000010 // 分子 1 在边缘流出
我必须强制边缘上的每个传出分子在某个周期返回源节点。分子必须在一个循环中返回意味着在循环的路径中,它必须存在于每个节点和它所采用的每个边缘上。 * 允许平行边。
分子 1 采用路径 S_Node -> Node_1 -> Node_2 ... -> S_Node。因此,分子 1 从边缘上的 S_Node 开始并穿过 Node_1 ...并在一个循环中回到 S_Node。因此,该分子满足条件。 同样,我必须检查每个边缘上的每个分子。
我正在以一种简单的可能方式检查每个节点有哪些可能的边缘出去,然后对于每个边缘有哪些可能存在的位,并强制每个节点在某个周期返回。
for (i = 0; i < N; i++) { // for each Node
for (j = 0; j < E; j++) { // for each Edge going out frm node i
// Lets say we have some way of finding E
if(edgeWeight & (1 << j)) { //All outgoing bits
// Enforcing that each will come back
// On some Cycle
很容易看出我必须遍历所有节点,然后所有边缘都出去,然后对于这些边缘上的每个位,必须编写代码来执行相同的操作。执行本身必须至少迭代 no.Of Nodes #N。
有没有更好的方法来有效地做到这一点?在图论中检查相同事物的任何其他方法?谢谢
【问题讨论】:
-
描述很不清楚,如果你问我...
-
会努力改进的。
-
如果我理解您必须强制执行每个“位”(分子)将循环
S_Node -> Node_1 -> Node_2 ... -> S_Node的循环,那么您似乎可以使用 单循环检查/强制执行并通过S_Node & Node_1 & Node_2 ...检查每个位,当&的结果为1时验证循环。 -
那是有点不清楚的地方。从最初来看,您似乎担心每个节点上特定“位位置”的循环(您的示例位 1)。如果它像检查每个位位置的循环一样简单,那么在单个循环中每个位位置的每个连接节点的 anding 将起作用。您如何首先确定“循环从哪个节点开始?”。和“你如何确定每个连接的唯一性?”(例如
S_Node(bit-1)和X_Node(bit-1)都连接到同一个分子上? -
这个问题不是很本地化吗?
标签: c algorithm graph-theory