C语言求解无向图顶点之间的所有最短路径

  

本文实例为大家分享了C语言求解无向图顶点之间的所有最短路径的具体代码,供大家参考,具体内容如下
  

  

<>强思路一:
  

  

DFS,遇到终点之后进行记录
  辅助存储:

        std:: vectortempPath;   std:: vector比;totalPath;      

实现:   

     //查找无向图的所有最短路径,直接dfs就可以解决了//记录保存这里用vector比;插入失败,重新搞一下好了//时间复杂度O (N + E)   # include & lt; iostream>   # include & lt; cstdio>   # include & lt; cstdlib>   # include & lt; vector>   # include & lt; set>      #定义最大10   #定义正999999      int图(MAX + 1) (MAX + 1);   整数N, M;//节点,优势   int nodeBook (MAX + 1);   int minPath=正;   std:: vectorpathNodeVec;   std:: vector比;allShortVec;   int startNode endNode;      空白dfs (int, int步骤)   {   如果(i==endNode){//遇到终点,进行路径判定   如果(步骤& lt;minPath) {   std:: cout & lt; & lt;“一步& lt;minpath . .、大?" & lt; & lt;allShortVec.size () & lt; & lt;std:: endl;   minPath=步骤;   pathNodeVec.push_back(我);   (汽车,elem pathNodeVec):   std:: cout & lt; & lt;elem & lt; & lt;“\ t”;   std:: cout & lt; & lt;std:: endl;      std:: vectortempVec=pathNodeVec;   allShortVec.clear ();//清空   allShortVec.push_back (tempVec);//存储   pathNodeVec.pop_back ();   }else if(步骤==minPath) {   std:: cout & lt; & lt;“==minpath步. .、大?" & lt; & lt;allShortVec.size () & lt; & lt;std:: endl;   pathNodeVec.push_back(我);   (汽车,elem pathNodeVec):   std:: cout & lt; & lt;elem & lt; & lt;“\ t”;   std:: cout & lt; & lt;std:: endl;   std:: vectortempVec=pathNodeVec;   allShortVec.push_back (tempVec);//存储当前路径   pathNodeVec.pop_back ();   其他}{;}   返回;   }      nodeBook[我]=1;   pathNodeVec.push_back(我);   for (int x=1;x & lt;=N;x + +){//尝试所有可能性   if (x==)   继续;   如果(nodeBook [x]==1)   继续;   如果(图[我][x]==正)   继续;   dfs (x,步骤+ 1);   }   nodeBook[我]=0;   pathNodeVec.pop_back ();   返回;   }   int主要(空白)   {   std:: cin祝辞祝辞N在祝辞M;   for (int x=1;x & lt;=N;x + +)   nodeBook [x]=0;//表示还没有访问   for (int x=1;x & lt;=N;+ + x)   for (int y=1;y & lt;=N;+ + y) {   如果(x==y)   图[x] [y]=0;   其他的   图[x] [y]=正;   }   for (int i=1;我& lt;=M;+ + i) {   int tempX、tempY tempWeight;   std:: cin祝辞祝辞tempX祝辞祝辞tempY祝辞祝辞tempWeight;   图(tempX] [tempY]=tempWeight;   }   std:: cout & lt; & lt;“请输入开始节点,结束节点:“& lt; & lt;std:: endl;   std:: cin祝辞祝辞startNode祝辞祝辞endNode;   pathNodeVec.clear ();   allShortVec.clear ();      dfs (startNode 0);   std:: cout & lt; & lt;“所有最短路径:\ t”;   std:: cout & lt; & lt;“大?" & lt; & lt;allShortVec.size () & lt; & lt;std:: endl;      (std:: vector祝辞::const_iterator它=allShortVec.begin ();它!=allShortVec.end ();+ +){   (std:: vector      

时间分析:

  
  

O (V + E)
  

     

缺点:
  

  

可能会爆栈,我这里算86 w点+ 414 w边直接爆,小的没问题。

  

<>强思路二:
  

  

BFS,位图矢量/. .记录好每一步的路径即可

  

时间   

  

O (V + E)
  

     

额外开销:
  

  

存储每一步的路径,如何维护好,尽量避免循环查找。

  

<>强思路三:
  

  

1。先求出起始点开始到其余所有点的最短路径,,Dijkstra
  2. 然后以终结束点为开始,反向进行dfs/bfs搜索;,,
  我每回退层,判断值(路)与起点到当前点最短路径长度临时的比较,
  二者相等,则继续(利用子问题的正确性);若(路)& lt;临时,则这个点不在最短路径上,放弃。
  

  

如图所示:

  

 C语言求解无向图顶点之间的所有最短路径”> <h2 class=C语言求解无向图顶点之间的所有最短路径