深度優先生成樹(無向圖,鄰接矩陣,DFS)
阿新 • • 發佈:2019-01-30
1、題目:
Problem Description
設有一連通無向圖,其頂點值為字元型並假設各值互不相等,採用鄰接矩陣表示法儲存表示。利用DFS演算法求其深度優先生成樹(從下標0的頂點開始遍歷),並在遍歷過程中輸出深度優先生成樹的每一條邊。Input
有多組測試資料,每組資料的第一行為兩個整數n和e,表示n個頂點和e條邊(0<n<20);第二行為其n個頂點的值,按輸入順序進行儲存;後面有e行,表示e條邊的資訊,每條邊資訊佔一行,包括邊所依附的頂點下標i和j,資料之間用空格隔開。Output
輸出深度優先生成樹的每一條邊,每組輸出佔一行,每條邊資訊之間有一空格,每行最後均有一空格,具體格式見樣例。
Sample Input
4 4 ABCD 0 1 0 3 1 2 1 3
Sample Output
(A,B) (B,C) (B,D)
2、參考程式碼一:
#include <iostream> using namespace std; int n,e; int vis[111]; int edge[111][111]; void dfs(int v,char* s){ vis[v]=1; for(int i=0;i<n;i++) { if(edge[v][i]==1 && vis[i]==0) { cout<<"("<<s[v]<<","<<s[i]<<") "; dfs(i,s); } } } int main() { int i,u,v; char str[111]; while(cin>>n>>e) { cin>>str; memset(edge,0,sizeof(edge)); memset(vis,0,sizeof(vis)); for(i=0;i<e;i++) { cin>>u>>v; edge[u][v]=edge[v][u]=1; } dfs(0,str); cout<<endl; } return 0; }
參考程式碼二:
#include <iostream> #include <string.h> using namespace std; class MGraph{ private: int vertexNum,arcNum; int edge[111][111]; char vertex[111]; public: int vis[111]; MGraph(char* a,int n,int m); ~MGraph(){} void DFS(int v,char* a); }; MGraph::MGraph(char* a,int n,int m){ vertexNum=n; arcNum=m; int i,j; for(i=0;i<n;i++) vertex[i]=a[i]; memset(edge,0,sizeof(edge)); while(m--){ cin>>i>>j; edge[i][j]=edge[j][i]=1; } } void MGraph::DFS(int v,char* a){ vis[v]=1; for(int j=0;j<vertexNum;j++){ if(edge[v][j]==1 && !vis[j]){ cout<<"("<<vertex[v]<<","<<vertex[j]<<") "; DFS(j,a); } } } int main() { int n,m,i; char a[111]; while(cin>>n>>m){ cin>>a; MGraph w(a,n,m); memset(w.vis,0,sizeof(w.vis)); w.DFS(0,a); cout<<endl; } return 0; }