我们得到一个包含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));
}
答案 0 :(得分:0)
锁定Dijkstra algorithm或A *(高级Dijkstra)。维基页面上有一些伪代码,你会发现你想要的任何语言都有很多实现...我认为它是最重要的路径识别算法之一。
答案 1 :(得分:0)
这是NP-Hard travelling salesman问题的变体。唯一的区别是您的起始节点是固定的,您似乎能够多次访问节点。
您可以使用许多算法。不幸的是,没有一个对大量节点非常有效。如果您不需要绝对最佳解决方案,可以使用近似算法。