对于相似的一个图,若是无向图,则如下: 若是有向图,则如下: 而具体实现代码,相差无几,自己要注意的是无向图是对称矩阵,有向图不一定是。 #include <iostream> using namespace std; #define MaxVertexNum 100 #define QueueSize 30 bool visited[MaxVertexNum]; typedef struct { char vertex[MaxVertexNum]; int edges[MaxVertexNum][MaxVertexNum]; int n,e; }MGraph; void CreateMGraph(MGraph &G) { int i,j,k; cout<<"请输入顶点数和边数:"; cin>>G.n>>G.e; cout<<"请输入顶点元素:"; for (i=0;i<G.n;i++) { cin>>G.vertex[i]; } for (i=0;i<G.n;i++) { for (j=0;j<G.n;j++) { G.edges[i][j]=0; } } // 无向图的建立 // cout<<"请输入边两端顶点序号:/n"; // for (k=0;k<G.e;k++) // { // cin>>i>>j; // G.edges[i][j]=1; // G.edges[j][i]=1; // } //有向图的建立 cout<<"请输入弧头和弧尾序号:/n"; for (k=0;k<G.e;k++) { cin>>i>>j; G.edges[i][j]=1; } } //深度优先搜索 void DFS(MGraph G,int i) { cout<<G.vertex[i]<<" "; visited[i]=true; for (int j=0;j<G.n;j++) { if (G.edges[i][j]==1 && !visited[j]) { DFS(G,j); } } } void DFSTraverseM(MGraph G) { int i; for (i=0;i<G.n;i++) { visited[i]=false; } for (i=0;i<G.n;i++) { if (!visited[i]) { DFS(G,i); } } } //广度优先搜索 typedef struct { int front; int rear; int count; int data[QueueSize]; }CirQueue; void InitQueue(CirQueue *Q) { Q->front=Q->rear=0; Q->count=0; } int QueueEmpty(CirQueue *Q) { return Q->count==QueueSize; } int QueueFull(CirQueue *Q) { return Q->count==QueueSize; } void EnQueue(CirQueue *Q,int x) { if (QueueFull(Q)) { cout<<"队列满啦~~"; } else { Q->count++; Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%QueueSize; } } int DeQueue(CirQueue *Q) { int temp; if (QueueEmpty(Q)) { cout<<"没东西可删"; return NULL; } else { temp=Q->data[Q->front]; Q->count--; Q->front=(Q->front+1)%QueueSize; return temp; } } void BFS(MGraph *G,int k) { int i,j; CirQueue Q; InitQueue(&Q); cout<<G->vertex[k]<<" "; visited[k]=true; EnQueue(&Q,k); while (!QueueEmpty(&Q)) { i=DeQueue(&Q); for (j=0;j<G->n;j++) { if (G->edges[i][j]==1 && !visited[j]) { cout<<G->vertex[j]<<" "; visited[j]=true; EnQueue(&Q,j); } } } } void BFSTraverseM(MGraph *G) { int i; for (i=0;i<G->n;i++) { visited[i]=false; } for (i=0;i<G->n;i++) { if (!visited[i]) { BFS(G,i); } } } int main() { MGraph G; CreateMGraph(G); cout<<"深度遍历:"; DFSTraverseM(G); cout<<"/n广度遍历:"; BFSTraverseM(&G); return 0; } 代码再发一次。