行进所有节点的最小长度

时间:2015-02-04 20:07:03

标签: c++ algorithm

我们得到一个包含N个节点的图形,它们之间有M个边缘,每个边缘都有一些与之相关的权重。现在我们需要以这样的方式遍历所有顶点,使得行进的总长度最小。 我们假设我们需要始终从节点1开始。

就像说我们有2个节点和2个边缘。

边缘1:介于1和2之间,长度为4

边缘2:介于1和3之间,长度为2

然后,这里需要移动的最小长度为8,因为一个将从节点1开始。然后到节点3然后返回到节点1然后再到节点2.

如何解决这个问题?请帮忙。

正如在评论和答案中所讨论的那样,我的TSP编写了它,但任何人都可以帮助我找到为什么这段代码给INT_MIN作为答案

#define MAXN 20
bool visited[MAXN][(1<<MAXN)+5];
int value[MAXN][(1<<MAXN)+5]; 
int weight[MAXN][MAXN] = {{0, 2, 4},{2, 0, -1},{4, -1, 0}};
int DP(int currentPos,int currentMask,int N){
if(currentMask==(1<<N)-1){
    visited[currentPos][currentMask]=true;
    return value[currentPos][currentMask];
}
if(visited[currentPos][currentMask]){
    return value[currentPos][currentMask];
}
int ans=INT_MAX;
int cost;
visited[currentPos][currentMask]=true;
for (int i=0;i<N;i++){
    if(weight[currentPos][i]!=-1 && ((currentMask)&(1<<i))==0){
        cost=DP(i,(currentMask)|(1 << i),N)+weight[currentPos][i];
        ans=min(ans,cost);
    }
}
return value[currentPos][currentMask]=ans;

}
int main ()
{
    memset (visited, false, sizeof (visited));
    printf ("Cost : %d\n", DP (0, 1,3));
}

2 个答案:

答案 0 :(得分:0)

锁定Dijkstra algorithm或A *(高级Dijkstra)。维基页面上有一些伪代码,你会发现你想要的任何语言都有很多实现...我认为它是最重要的路径识别算法之一。

答案 1 :(得分:0)

这是NP-Hard travelling salesman问题的变体。唯一的区别是您的起始节点是固定的,您似乎能够多次访问节点。

您可以使用许多算法。不幸的是,没有一个对大量节点非常有效。如果您不需要绝对最佳解决方案,可以使用近似算法。