【发布时间】:2011-02-22 04:07:35
【问题描述】:
谁能给我一个 C 代码来查找两个节点之间的所有可能路径? 例如。 如果图有以下边 1-2 1-3 2-3 2-4 3-4
1 到 4 之间的所有路径都是:
1-2-3-4
1-2-4
1-3-4
1-3-2-4
【问题讨论】:
标签: c
谁能给我一个 C 代码来查找两个节点之间的所有可能路径? 例如。 如果图有以下边 1-2 1-3 2-3 2-4 3-4
1 到 4 之间的所有路径都是:
1-2-3-4
1-2-4
1-3-4
1-3-2-4
【问题讨论】:
标签: c
深度优先搜索可以完成这项工作。
【讨论】:
(我假设您不希望路径中有重复节点 - 否则可能的路径数量是无限的。)
你可以放松一下:
while (there is a change) {
for (v in nodes(G)) {
for (e in edges(v)) {
paths_to[v] = paths_to[v] union ((paths_to[e.to] not containing v) append v)
}
}
}
结果仍然可以是输入图大小的指数。获取所有路径可能不是您想要做的。
【讨论】:
这是解决问题的简单算法。这不是一个最优算法。
static struct {
int value1;
int value2;
int used;
} data[] = {
{ 1, 2 },
{ 1, 3 },
{ 2, 3 },
{ 2, 4 },
{ 3, 4 },
};
enum { DATA_SIZE = sizeof data / sizeof *data };
static int output[DATA_SIZE];
int traverse(int from, int to, int depth) {
output[depth++] = from;
int i;
if (from == to) {
for (i = 0; i < depth; i++) {
if (i) {
printf("-");
}
printf("%d", output[i]);
}
printf("\n");
} else {
for (i = 0; i < DATA_SIZE; i++) {
if (!data[i].used) {
data[i].used = 1;
if (from == data[i].value1) {
traverse(data[i].value2, to, depth);
} else if (from == data[i].value2) {
traverse(data[i].value1, to, depth);
}
data[i].used = 0;
}
}
}
}
int main() {
traverse(1, 4, 0);
}
【讨论】:
递归方法:
findPaths(path = startNode, goal)
paths = []
if the last node in path is goal:
return path
for each node n connected to the last node in path:
if n is not already on the path:
paths.append(findPaths(path.append(node), goal))
return paths //may still be []
【讨论】:
为时已晚,不是 C 代码,但可能对其他人有所帮助。这个算法展示了我如何在 java 中实现它。
findPath(start)
Childs = getDirectChildsOf(start)
foreach child in Childs
tempRoute;
tempRoute.add(start)
if (child == end)
return tempRoute.add(child)
else
tempRoute.add(findPath(child))
if (tempRoute.last() == end)
return tempRoute;
这里的tempRoute 可能是一个维护节点列表的Route 类。可以将单个node 和其他route 添加到tempRoute。
它也找不到所有可能的路径。为此,您必须为每个节点维护一个访问标志。
【讨论】: