資料結構與演算法C++之圖的獲得兩點之間的一條路徑
阿新 • • 發佈:2019-02-15
使用深度優先遍歷即可獲得兩點間的一條路徑
定義 Path.h 實現獲取路徑
#include <stack>
#include <iostream>
#include <cassert>
using namespace std;
template <typename Graph>
class Path{
private:
Graph &G;
int s;
bool *visited;
int *from;
void dfs(int v){
visited[v] = true;
typename Graph::adjIterator adj(G, v);
for ( int i = adj.begin(); !adj.end(); i = adj.next() ){
if ( !visited[i] ){
from[i] = v;
dfs(i);
}
}
}
public:
Path(Graph &graph, int s):G(graph){
//演算法初始化
assert ( s >= 0 && s < G.V() );
visited = new bool[G.V()];
from = new int[G.V()];
for ( int i = 0; i < G.V(); i++){
visited[i] = false;
from[i] = -1;
}
this->s = s;
//尋路演算法
dfs(s);
}
~Path() {
delete[ ] visited;
delete[] from;
}
bool hasPath(int w){
assert( w >= 0 && w < G.V() );
return visited[w];
}
void path(int w, vector<int> &vec){
stack<int> s;
int p = w;
while ( p != -1 ){
s.push(p);
p = from[p];
}
vec.clear();
while ( !s.empty() ){
vec.push_back( s.top() );
s.pop();
}
}
void showPath(int w){
vector<int> vec;
path(w, vec);
for(int i = 0; i < vec.size(); i ++){
cout<<vec[i];
if(i == vec.size() - 1)
cout<<endl;
else
cout<<" -> ";
}
}
};
測試程式如下
#include <ctime>
#include <cstdlib>
#include "SparseGraph.h"
#include "DenseGraph.h"
#include "ReadGraph.h"
#include "Path.h"
using namespace std;
int main()
{
string filename = "testG2.txt";
SparseGraph g = SparseGraph( 7, false );
ReadGraph<SparseGraph> readGraph( g, filename );
g.show();
cout<<endl;
Path<SparseGraph> dfs( g, 0 );
cout<<"DFS : ";
dfs.showPath(6);
return 0;
}
上面呼叫的其他標頭檔案見上篇部落格
輸出為
獲取兩點之間的路徑可以用來檢視圖中的環