資料結構BFS與DFS的實現(鄰接矩陣)
阿新 • • 發佈:2018-11-27
#include<bits/stdc++.h> #define MaxInt 2e9 #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef char VerTexType; typedef int Status; typedef int ArcType; bool visit[MVNum]; typedef struct { VerTexType vex[MVNum]; ArcType arcs[MVNum][MVNum]; int vexnum,arcnum; }AMGraph; int LocateVex(AMGraph &G,char &v) { int i; for (i=0;i<G.vexnum;i++) { if (G.vex[i]==v) return i; } if (i>=G.vexnum) return ERROR; else return 0; } Status CreateUDN(AMGraph &G) { int i,j,k; char v1,v2; printf("輸入圖的頂點數:"); scanf("%d",&G.vexnum); printf("輸入邊的條數:"); scanf("%d",&G.arcnum); printf("輸入各個點的資訊:\n"); for (i=0;i<G.vexnum;i++) cin>>G.vex[i]; for (i=0;i<G.vexnum;i++) for (j=0;j<G.vexnum;j++) G.arcs[i][j] = 0; printf("\n輸入由兩個頂點構成的邊:\n"); for (k=0;k<G.arcnum;k++) { cin>>v1>>v2; i = LocateVex(G,v1); j = LocateVex(G,v2); G.arcs[i][j] = 1; G.arcs[j][i] = 1; } printf("\n圖建立成功!\n"); return OK; } void dfs(AMGraph G, int i) { int j,k; stack<int> s; s.push(i); printf("%c ",G.vex[i]); visit[i] = 1; while(!s.empty()) { i = s.top(); for(j=0;j<G.vexnum;j++) { if(G.arcs[i][j]!=0 && !visit[j]) { s.push(j); printf("%c ",G.vex[j]); visit[j] = 1; i = j; j = 0; } } if(!s.empty()) s.pop(); } } void DFS(AMGraph G,int k) { visit[k] = 1; printf("%c ",G.vex[k]); for (int w=0;w<G.vexnum;w++) if (G.arcs[k][w]!=0 && !visit[w]) DFS(G,w); } void DFSTravel(AMGraph G) { printf("\nDFS遞迴遍歷:\n"); memset(visit,0,sizeof(visit)); for (int i=0;i<G.vexnum;i++) if (!visit[i]) DFS(G,i); printf("\n"); printf("\nDFS非遞迴遍歷:\n"); memset(visit,0,sizeof(visit)); for (int i=0;i<G.vexnum;i++) if (!visit[i]) dfs(G,i); printf("\n"); } void BFS(AMGraph G,int k) { queue<int> q; memset(visit,0,sizeof(visit)); if (!visit[k]) { visit[k] = 1; printf("%c ",G.vex[k]); q.push(k); } while (!q.empty()) { int t = q.front(); q.pop(); for (int w=0;w<G.vexnum;w++) { if (G.arcs[t][w]!=0 && !visit[w]) { visit[w] = 1; printf("%c ",G.vex[w]); q.push(w); } } } } void BFSTravel(AMGraph G) { printf("\nBFS遍歷:\n"); memset(visit,0,sizeof(visit)); for (int i=0;i<G.vexnum;i++) if (!visit[i]) BFS(G,i); printf("\n"); } int main() { AMGraph G; CreateUDN(G); DFSTravel(G); BFSTravel(G); return 0; }