首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求无向连通图下给点两点间的所有路径的算法

2012-07-05 
求无向连通图上给点两点间的所有路径的算法现有一无向连通图,给定图上两点,求该两点之间的所有路径的集合,

求无向连通图上给点两点间的所有路径的算法
现有一无向连通图,给定图上两点,求该两点之间的所有路径的集合,该怎样实现?最好能给出具体的算法描述,谢谢了!

[解决办法]
Floyd算法...去看看书吧

核心思路
  通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
  从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
  采用的是松弛技术,对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);

  c语言:
  #include<fstream>
  #define Maxm 501
  using namespace std;
  ifstream fin("APSP.in");
  ofstream fout("APSP.out");
  int p,q,k,m;
  int Vertex,Line[Maxm];
  int Path[Maxm][Maxm],Map[Maxm][Maxm],Dist[Maxm][Maxm];
  void Root(int p,int q)
  {
  if (Path[p][q]>0)
  {
  Root(p,Path[p][q]);
  Root(Path[p][q],q);
  }
  else 
  {
  Line[k]=q;
  k++;
  }
  }
  int main()
  {
  memset(Path,0,sizeof(Path));
  memset(Map,0,sizeof(Map));
  memset(Dist,0,sizeof(Dist));
  fin >> Vertex;
  for(p=1;p<=Vertex;p++)
  for(q=1;q<=Vertex;q++)
  {
  fin >> Map[p][q];
  Dist[p][q]=Map[p][q];
  }
  for(k=1;k<=Vertex;k++)
  for(p=1;p<=Vertex;p++)
  if (Dist[p][k]>0)
  for(q=1;q<=Vertex;q++)
  if (Dist[k][q]>0)
  {
  if (((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q))
  {
  Dist[p][q]=Dist[p][k]+Dist[k][q];
  Path[p][q]=k;
  }
  }
  for(p=1;p<=Vertex;p++)
  {
  for(q=p+1;q<=Vertex;q++)
  {
  fout << "\n==========================\n"; 
  fout << "Source:" << p << '\n' << "Target " << q << '\n'; 
  fout << "Distance:" << Dist[p][q] << '\n';
  fout << "Path:" << p;
  k=2;
  Root(p,q);
  for(m=2;m<=k-1;m++)
  fout << "-->" << Line[m];
  fout << '\n';
  fout << "==========================\n";
  }
  }
  fin.close();
  fout.close();
  return 0;
  }
  注解:无法连通的两个点之间距离为0;
测试数据:
  Sample Input
  7
  00 20 50 30 00 00 00
  20 00 25 00 00 70 00
  50 25 00 40 25 50 00
  30 00 40 00 55 00 00
  00 00 25 55 00 10 70
  00 70 50 00 10 00 50
  00 00 00 00 70 50 00
  Sample Output
  ==========================
  Source:1
  Target 2
  Distance:20
  Path:1-->2
  ==========================
  ==========================
  Source:1
  Target 3
  Distance:45
  Path:1-->2-->3
  ==========================
  ==========================
  Source:1
  Target 4
  Distance:30
  Path:1-->4
  ==========================
  ==========================
  Source:1
  Target 5
  Distance:70
  Path:1-->2-->3-->5
  ==========================
  ==========================
  Source:1
  Target 6
  Distance:80
  Path:1-->2-->3-->5-->6
  ==========================
  ==========================
  Source:1
  Target 7
  Distance:130
  Path:1-->2-->3-->5-->6-->7
  ==========================
  ==========================
  Source:2
  Target 3
  Distance:25
  Path:2-->3
  ==========================
  ==========================
  Source:2
  Target 4
  Distance:50
  Path:2-->1-->4
  ==========================
  ==========================
  Source:2
  Target 5
  Distance:50
  Path:2-->3-->5
  ==========================
  ==========================
  Source:2
  Target 6
  Distance:60
  Path:2-->3-->5-->6


  ==========================
  ==========================
  Source:2
  Target 7
  Distance:110
  Path:2-->3-->5-->6-->7
  ==========================
  ==========================
  Source:3
  Target 4
  Distance:40
  Path:3-->4
  ==========================
  ==========================
  Source:3
  Target 5
  Distance:25
  Path:3-->5
  ==========================
  ==========================
  Source:3
  Target 6
  Distance:35
  Path:3-->5-->6
  ==========================
  ==========================
  Source:3
  Target 7
  Distance:85
  Path:3-->5-->6-->7
  ==========================
  ==========================
  Source:4
  Target 5
  Distance:55
  Path:4-->5
  ==========================
  ==========================
  Source:4
  Target 6
  Distance:65
  Path:4-->5-->6
  ==========================
  ==========================
  Source:4
  Target 7
  Distance:115
  Path:4-->5-->6-->7
  ==========================
  ==========================
  Source:5
  Target 6
  Distance:10
  Path:5-->6
  ==========================
  ==========================
  Source:5
  Target 7
  Distance:60
  Path:5-->6-->7
  ==========================
  ==========================
  Source:6
  Target 7
  Distance:50
  Path:6-->7

PS:以上程序来自baidu百科

[解决办法]
所有路径,中间绕N圈的算不?
算的话,肯定无穷。

不算的话。
以两端固定,中间是其他点的排列组合(大于N的阶乘,因为包括不使用全部点的情况。)
N层循环,每层循环元素为未使用的点或空白。
然后剔除相邻点没有通路的组合方式。

当然,实现代码时,应当边循环边检查相邻点通路,及时停止多余的子循环。

[解决办法]

探讨
递推方程:
设起点为st,终点为ed.
用n(a,b,S)表示从点a到点b经过点集S的简单路径条数,
用n(a,b)表示从a到b的简单路径条数,则:
n(st,b,s)=∑n(st,u,S-{b}),(u,b)∈E且u∈S-{b}
n(st,ed)=∑n(st,ed,S),其中求和是对所有S进行的。

热点排行