DS圖遍歷--廣度優先搜尋
阿新 • • 發佈:2018-12-30
給出一個圖的鄰接矩陣,對圖進行深度優先搜尋,從頂點0開始
注意:圖n個頂點編號從0到n-1
輸入
第一行輸入t,表示有t個測試例項
第二行輸入n,表示第1個圖有n個結點
第三行起,每行輸入鄰接矩陣的一行,以此類推輸入n行
第i個結點與其他結點如果相連則為1,無連線則為0,資料之間用空格隔開
以此類推輸入下一個示例
輸出
每行輸出一個圖的廣度優先搜尋結果,結點編號之間用空格隔開
樣例輸入
2 4 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0 5 0 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0
樣例輸出
0 2 3 1 0 3 4 2 1
#include <iostream> #include <queue> using namespace std; const int MaxLen =20; class Map{ private: bool Visit[MaxLen]; int Matrix[MaxLen][MaxLen]; int Vexnum; void DFS(int v); void BFS(int v); public: void SetMatrix(int vnum,int **mx); void DFSTraverse(); void BFSTraverse(); }; void Map::BFSTraverse() { for(int i=0;i<Vexnum;i++) Visit[i]=false; cout<<0<<' '; Visit[0]=true; BFS(0); cout<<endl; } void Map::BFS(int v) { queue<int> Q; for(int i=0;i<Vexnum;i++) { if(Matrix[v][i]!=0 &&!Visit[i]) { cout<<i<<' '; Visit[i]=true; Q.push(i); } } while(!Q.empty()) { BFS(Q.front()); Q.pop(); } } void Map::SetMatrix(int vnum,int **mx) { int i,j; Vexnum =vnum; for(i=0;i<MaxLen;i++) for(j=0;j<MaxLen;j++) Matrix[i][j]=0; for(i=0;i<Vexnum;i++) for(j=0;j<Vexnum;j++) Matrix[i][j]=mx[i][j]; } void Map::DFSTraverse() { int v; for(int i=0;i<MaxLen;i++) Visit[i]=false; for(int i=0;i<Vexnum;i++) { if(!Visit[i]) DFS(i); } cout<<endl; } void Map::DFS(int v) { int i,k; if(!Visit[v]) { cout<<v<<' '; Visit[v]=true; } int *AdjVex=new int[Vexnum]; for(int i=0;i<Vexnum;i++) AdjVex[i]=-1; k=0; for(int p=0;p<Vexnum;p++) { if(Matrix[v][p]!=0 &&!Visit[p]) { AdjVex[k]=p; k++; } } i=0; while(AdjVex[i]!=-1) { DFS(AdjVex[i]); i++; } delete []AdjVex; } void test() { Map t; int n; cin>>n; int **m; m=new int*[n]; for(int i=0;i<n;i++) { m[i]=new int[n]; for(int j=0;j<n;j++) { cin>>m[i][j]; } } t.SetMatrix(n,m); t.BFSTraverse(); } int main() { int t; cin>>t; while(t--) test(); }