最短路径的问题

时间:2022-03-31 20:38:35
n个点, 从第1个点走到第n个点最多有多少条最短路径,并穷举出这些最短路径。每两点间的距离可以任意设。

很莫名其妙的题目,如有知道的请指教。 是老师布置的作业

10 个解决方案

#1


upup

#2


是一维的点还是二位三维的点,是不是需要经过其他的点,可不可以重复经过某些点?你的问题说得不清不楚,请说明白一点

#3


这个程序我写了很久了,而且还是从我写的图类中截取出来的,可能有些地方不太对,不过算法的思想还可以看出来,你要的功能只要改一下就可以了.如果你想要我的可以运行的源程序的话,我可以EMAIL给你.不过它没有注释哟!另外,这个算法在数据结构的书中有源程序的,你可以找一本来看看.
int ShortPath(unsigned long NodeID1)
{
NType lPath[N][N];//建立路径表;N为结点数,NType为表中元素的类型

//初始化路径表
memset(lPath,-1, N^N*Sizeof(NType));
for (long i=0;i<N;i++)
{
lPath[0][i]=Graph[NodeID1][i];
if (lPath[0][i])
lPath[1][i]=i;
}

//搜索最短路径
for (long i=1;i<N;i++)
for (long j=0;j<N;j++)
{
long ttt=lPath[i][j];
if (ttt>=0)
for (long p=0;p<N;p++)
if (Graph[ttt][p]>0&&lPath[0][ttt]>0&&(lPath[0][p]==0||Graph[ttt][p]+lPath[0][ttt]<lPath[0][p]))
{
lPath[0][p]=Graph[ttt][p]+lPath[0][ttt];
for(long k=1;k<=i;k++)
lPath[k][p]=lPath[k][ttt];
lPath[i+1][p]=p;
}
}
//搜索的结果在lPath中,lPath[0][i]为结点NodeID1到结点i的最短路径长度,lPath[1][i]~lPath[a][i]为最短路径所经过的结点.
//一次可以找出NodeID1到其它所有结点的最短路径.
//Graph[N][N]为图的代权邻接矩阵
}

#4


这个题很easy码
不久使用Dijkstra算法吗!

#5


谢谢redleave的回答。你的程序我还没来的及看。 

这和dijkstra基本没有关系。 可以理解为一维的点。 要求是最短路径最多。 从第一个点到最后一个点,途中经过的点任意。 每两点间的距离也任意。 我不太明白如何才能让最短路径最多,到底多少算是最多

#6


我的看法:
遍歷所有的點,从第一个点到N个点,让最短路径最多,這些點該由多個正方形或正方體構成。
下面C++程序我可沒測試過,不過我想它是正確的。
#include <algorithm.h>
#include <assert.h>
unsigned int Distance(POINT *P1,POINT *P2);//該函數返回兩點間的距離。
//POINT結構與 Distance方法,該由使用者定義。
unsigned int HowManyPath(POINT *P,unsigned int &n,int *MinPath)
{int *Path,MinDistance=0,CountPath = 1,K=0;
 unsigned int *Tmp;
 assert(n>2);
 Path = new int[(n-1)*n*n];//路徑 這里分配很大內存:n*n*n保存所有路徑
 Tmp  = new unsigned int[(n-1)*n];//長度,
 if(!Path || !Tmp) return 0;     //內存分配失敗。
 for(int i = 0;i<n;i++) Path[i]=i;
 for(int i = 0;i<n;i++) Tmp[i] =0;
 for(int x = 1;x<n-1;x++)
    for(int y = 1;y<n-1;y++)
        {for(int z = 1;z<n-1;z++) if(Path[z] == y) swap(Path[x],Path[z]);
         memcpy(&Path[x*n],&Path[0],sizeof(int)*n);
         for(int i = 1;i<n;i++)  Tmp[K] += Distance(P+i-1,P+i);
         if(MinDistance > Tmp[K]) MinDistance = Tmp[K];
         ++K;
        }
 for(int i = 0;i<K;i++) if(MinDistance == Tmp[i]) ++CountPath;
 MinPath = new int[n*CountPath] ; //返回全部最短路徑
 int J=0;
 for(int i = 0;i<K;i++)
   if(MinDistance == Tmp[i])
       {memcpy(&MinPath[J],&Path[(i+1)*n],sizeof(int)*n);  //最短路徑
        J += n;
       }
 delete Path;
 delete Tmp;
 n = CountPath; //返回最短路徑數量
 return MinDistance;  //返回最短長度
}

#7


唉,剛貼上去就看到了一處錯誤:
memcpy(&Path[x*n],&Path[0],sizeof(int)*n);
for(int i = 1;i<n;i++)  Tmp[K] += Distance(P+i-1,P+i);
應修改如下:
memcpy(&Path[x*n],&Path[0],sizeof(int)*n);
for(int i = 1;i<n;i++)  Tmp[K] += Distance(P+Path[i]-1,P+Path[i]);
如果錯誤太多,當我沒說,對不起了。

#8


K--短路问题!

#9


upup

#10


K--短路问题:扫除法,扩展的Ford法...

#1


upup

#2


是一维的点还是二位三维的点,是不是需要经过其他的点,可不可以重复经过某些点?你的问题说得不清不楚,请说明白一点

#3


这个程序我写了很久了,而且还是从我写的图类中截取出来的,可能有些地方不太对,不过算法的思想还可以看出来,你要的功能只要改一下就可以了.如果你想要我的可以运行的源程序的话,我可以EMAIL给你.不过它没有注释哟!另外,这个算法在数据结构的书中有源程序的,你可以找一本来看看.
int ShortPath(unsigned long NodeID1)
{
NType lPath[N][N];//建立路径表;N为结点数,NType为表中元素的类型

//初始化路径表
memset(lPath,-1, N^N*Sizeof(NType));
for (long i=0;i<N;i++)
{
lPath[0][i]=Graph[NodeID1][i];
if (lPath[0][i])
lPath[1][i]=i;
}

//搜索最短路径
for (long i=1;i<N;i++)
for (long j=0;j<N;j++)
{
long ttt=lPath[i][j];
if (ttt>=0)
for (long p=0;p<N;p++)
if (Graph[ttt][p]>0&&lPath[0][ttt]>0&&(lPath[0][p]==0||Graph[ttt][p]+lPath[0][ttt]<lPath[0][p]))
{
lPath[0][p]=Graph[ttt][p]+lPath[0][ttt];
for(long k=1;k<=i;k++)
lPath[k][p]=lPath[k][ttt];
lPath[i+1][p]=p;
}
}
//搜索的结果在lPath中,lPath[0][i]为结点NodeID1到结点i的最短路径长度,lPath[1][i]~lPath[a][i]为最短路径所经过的结点.
//一次可以找出NodeID1到其它所有结点的最短路径.
//Graph[N][N]为图的代权邻接矩阵
}

#4


这个题很easy码
不久使用Dijkstra算法吗!

#5


谢谢redleave的回答。你的程序我还没来的及看。 

这和dijkstra基本没有关系。 可以理解为一维的点。 要求是最短路径最多。 从第一个点到最后一个点,途中经过的点任意。 每两点间的距离也任意。 我不太明白如何才能让最短路径最多,到底多少算是最多

#6


我的看法:
遍歷所有的點,从第一个点到N个点,让最短路径最多,這些點該由多個正方形或正方體構成。
下面C++程序我可沒測試過,不過我想它是正確的。
#include <algorithm.h>
#include <assert.h>
unsigned int Distance(POINT *P1,POINT *P2);//該函數返回兩點間的距離。
//POINT結構與 Distance方法,該由使用者定義。
unsigned int HowManyPath(POINT *P,unsigned int &n,int *MinPath)
{int *Path,MinDistance=0,CountPath = 1,K=0;
 unsigned int *Tmp;
 assert(n>2);
 Path = new int[(n-1)*n*n];//路徑 這里分配很大內存:n*n*n保存所有路徑
 Tmp  = new unsigned int[(n-1)*n];//長度,
 if(!Path || !Tmp) return 0;     //內存分配失敗。
 for(int i = 0;i<n;i++) Path[i]=i;
 for(int i = 0;i<n;i++) Tmp[i] =0;
 for(int x = 1;x<n-1;x++)
    for(int y = 1;y<n-1;y++)
        {for(int z = 1;z<n-1;z++) if(Path[z] == y) swap(Path[x],Path[z]);
         memcpy(&Path[x*n],&Path[0],sizeof(int)*n);
         for(int i = 1;i<n;i++)  Tmp[K] += Distance(P+i-1,P+i);
         if(MinDistance > Tmp[K]) MinDistance = Tmp[K];
         ++K;
        }
 for(int i = 0;i<K;i++) if(MinDistance == Tmp[i]) ++CountPath;
 MinPath = new int[n*CountPath] ; //返回全部最短路徑
 int J=0;
 for(int i = 0;i<K;i++)
   if(MinDistance == Tmp[i])
       {memcpy(&MinPath[J],&Path[(i+1)*n],sizeof(int)*n);  //最短路徑
        J += n;
       }
 delete Path;
 delete Tmp;
 n = CountPath; //返回最短路徑數量
 return MinDistance;  //返回最短長度
}

#7


唉,剛貼上去就看到了一處錯誤:
memcpy(&Path[x*n],&Path[0],sizeof(int)*n);
for(int i = 1;i<n;i++)  Tmp[K] += Distance(P+i-1,P+i);
應修改如下:
memcpy(&Path[x*n],&Path[0],sizeof(int)*n);
for(int i = 1;i<n;i++)  Tmp[K] += Distance(P+Path[i]-1,P+Path[i]);
如果錯誤太多,當我沒說,對不起了。

#8


K--短路问题!

#9


upup

#10


K--短路问题:扫除法,扩展的Ford法...