廣度優先搜尋BFS 之圖的構造及遍歷
阿新 • • 發佈:2019-01-03
1. 由給定的頂點和邊的資訊構造圖的鄰接矩陣儲存; 對該圖進行深度優先搜尋,輸出搜尋得到的結點序列;
3. 以鄰接表作儲存結構,用克魯斯卡爾演算法構造最小生成樹。
/* 5 6 abcde 0 1 10 0 3 20 1 2 30 1 4 40 2 3 50 2 4 60 */ #include<iostream> #include<cstdio> #include<queue> #include<cstring> usingnamespace std; #definemaxn 100 #defineINF 999999 #defineMAXVEX 100 typedefstruct { char vexs[MAXVEX]; double arcs[MAXVEX][MAXVEX]; int n,e; }mGraph; queue<char>qu; intflag[maxn]; voidcreateAdjMatrix(mGraph *G) { int i,j,k; double w; printf("請輸入圖的節點數和邊數:\n"); scanf("%d%d",&G->n,&G->e); getchar(); for(i=0;i<G->n;i++) flag[i]=0; printf("請輸入圖的節點:\n"); for(k=0;k<G->n;k++)scanf("%c",&G->vexs[k]); for(i=0;i<G->n;i++) for(j=0;j<G->n;j++) G->arcs[i][j]=INF; printf("請輸入圖的邊以及邊的權:\n"); for(k=0;k<G->e;k++) { scanf("%d%d%lf",&i,&j,&w); G->arcs[i][j]=w; G->arcs[j][i]=w; } } voidbfs(mGraph *G) { int num=0; for(int i=0;i<G->n;i++) flag[i]=0; for(int i=0; i<G->n; i++) if(flag[i]==0) { flag[i]=1; qu.push(G->vexs[i]); while(!qu.empty()) { char ss=qu.front(); qu.pop(); if(num==G->n-1) cout<<ss<<endl; else cout<<ss<<""; num++; for(int j=0; j<G->n; j++) if(G->arcs[i][j]<INF&& flag[j]==0) { qu.push(G->vexs[j]); flag[j]=1; } } } } intmain() { mGraph m; createAdjMatrix(&m); printf("遍歷序列如下:\n"); bfs(&m); return 0; }