圖的鄰接矩陣儲存與遍歷
阿新 • • 發佈:2019-01-24
#include <stdio.h> #include<queue> ///呼叫STL佇列庫函式 #include<stack> ///呼叫STL棧庫函式 #include<string.h> #define max 20 using namespace std; int visited[max]={0}; typedef struct Arccell{ int adj; }Arccell,Adjm[max][max]; typedef struct{ int vexs[max]; Adjm arcs; int vex,arc; }Mgraph; int Locatevex(Mgraph &G,int v) { int i,k=-1; for(i=0;i<G.vex;i++) if(v==G.vexs[i]) { k=i; break; } return k; } void CreateGraph(Mgraph &G) { int i,j,k; int s; int v1,v2; printf ("輸入圖的頂點數與邊數:\n"); scanf("%d%d",&G.vex,&G.arc); printf("輸入頂點資訊:\n"); for(i=0;i<G.vex;i++) { scanf("%d",&s); G.vexs[i]=s; } for(i=0;i<G.vex;i++) ///初始化鄰接矩陣 for(j=0;j<=G.vex;j++) G.arcs[i][j].adj=0; printf("輸入一邊依附的兩個頂點:\n"); for(k=0;k<G.arc;k++) { scanf("%d%d",&v1,&v2); i=Locatevex(G,v1); j=Locatevex(G,v2); if((i!=-1)&&(j!=-1)) G.arcs[i][j].adj=1; G.arcs[j][i]=G.arcs[i][j]; } } void DFS (Mgraph G,int v) { int i; visited[v]=1; printf("%d ",G.vexs[v]); for (i=0;i<G.vex;i++) if (!visited[i] && G.arcs[v][i].adj) DFS(G,i); } void DFStravel1(Mgraph G) {///DFS遞迴遍歷 int i; for (i=0;i<G.vex;i++) { if (!visited[i]) DFS(G,i); } } void DFStravel2(Mgraph G,int v) {///DFS非遞迴遍歷 stack<int>s; printf("%d ",G.vexs[v]); visited[v]=1; s.push(v); while(!s.empty()) { int i,j; i=s.top(); for(j=0;j<G.vex;j++) { if(G.arcs[i][j].adj==1 && !visited[j]) { printf("%d ",G.vexs[j]); visited[j]=1; s.push(j); break; } } if (j==G.vex) { s.pop(); } } } void BFStravel(Mgraph G) {///BFS非遞迴遍歷 int i,j,k; int v; queue <int>q; for(i=0;i<G.vex;i++) { if(!visited[i]) { printf("%d ",G.vexs[i]); visited[i]=1; q.push(G.vexs[i]); while(!q.empty()) { v=q.front(); q.pop(); k=Locatevex(G,v); for(j=0;j<G.vex;j++) { if(!visited[j] && G.arcs[k][j].adj) { visited[j]=1; printf("%d ",G.vexs[j]); q.push(G.vexs[j]); } } } } } } void printGraph(Mgraph &G) { int i,j; for(i=0;i<G.vex;i++) { for(j=0;j<G.vex;j++) printf("%2d",G.arcs[i][j].adj); printf("\n"); } } int main () { Mgraph g; int i; CreateGraph (g); printGraph (g); printf ("深度優先遞迴遍歷:\n"); DFStravel1 (g); printf ("\n"); printf ("深度優先非遞迴遍歷:\n"); for(i=0;i<g.vex;i++) visited[i]=0; for(i=0;i<g.vex;i++) { if (!visited[i]) { DFStravel2(g,i); } } printf ("\n"); memset (visited,0,sizeof(visited)); printf ("廣度優先遍歷:\n"); BFStravel(g); return 0; }