图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)

来源:互联网 发布:软件实施实习心得体会 编辑:程序博客网 时间:2024/05/01 22:53
#include <iostream>#include <stdio.h>#include <cstdlib>#include <cstring>#include <string>#include <queue>using namespace std;typedef struct MGraph{string vexs[10];//顶点向量int arcs[10][10];//邻接矩阵int vexnum, arcnum;//图的顶点数和边数}MGraph;int LocateVex(MGraph G, string u)//返回顶点u在图中位置{for(int i=0; i<G.vexnum; i++)if(u==G.vexs[i])return i;return -1;}void CreateUDG(MGraph &G)//构造无向图{string v1,v2;int i, j, k;cout<<"请输入顶点数和边数:";cin>>G.vexnum>>G.arcnum;cout<<"请输入顶点:";for(i=0; i<G.vexnum; i++)cin>>G.vexs[i];for(i=0; i<G.vexnum; i++)for(j=0; j<G.vexnum; j++)G.arcs[i][j]=0;cout<<"请输入边:"<<endl;for(k=0; k<G.arcnum; k++){cin>>v1>>v2;i=LocateVex(G, v1);j=LocateVex(G, v2);G.arcs[i][j]=G.arcs[j][i]=1;}}void CreateUDN(MGraph &G)//构造无向网{string v1, v2;int i, j, k;int w;cout<<"请输入顶点数和边数:";cin>>G.vexnum>>G.arcnum;cout<<"请输入顶点:";for(i=0; i<G.vexnum; i++)cin>>G.vexs[i];for(i=0; i<G.vexnum; i++)for(j=0; j<G.vexnum; j++)G.arcs[i][j]=-1000;    cout<<"请输入边:"<<endl;for(k=0; k<G.arcnum; k++){cin>>v1>>v2>>w;i=LocateVex(G, v1);j=LocateVex(G, v2);G.arcs[i][j]=G.arcs[j][i]=w;}}void CreateDG(MGraph &G)//构造有向图{string v1, v2;int i, j, k;cout<<"请输入顶点数和边数:";cin>>G.vexnum>>G.arcnum;cout<<"请输入顶点:";for(i=0; i<G.vexnum; i++)cin>>G.vexs[i];for(i=0; i<G.vexnum; i++)for(j=0; j<G.vexnum; j++)G.arcs[i][j]=0;    cout<<"请输入边:"<<endl;for(k=0; k<G.arcnum; k++){cin>>v1>>v2;i=LocateVex(G, v1);j=LocateVex(G, v2);G.arcs[i][j]=1;}}void CreateDN(MGraph &G)//构造有向网{string v1, v2;int i, j, k;int w;cout<<"请输入顶点数和边数:";cin>>G.vexnum>>G.arcnum;cout<<"请输入顶点:";for(i=0; i<G.vexnum; i++)cin>>G.vexs[i];for(i=0; i<G.vexnum; i++)for(j=0; j<G.vexnum; j++)G.arcs[i][j]=-1000;    cout<<"请输入边:"<<endl;for(k=0; k<G.arcnum; k++){cin>>v1>>v2>>w;i=LocateVex(G, v1);j=LocateVex(G, v2);G.arcs[i][j]=w;}}int FirstAdjVex(MGraph G, int v)//返回顶点v的第一个邻接顶点序号{for(int i=0; i<G.vexnum; i++)if(G.arcs[v][i]==1)return i;return -1;}int NextAdjVex(MGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接顶点序号{for(int i=w+1; i<G.vexnum; i++)if(G.arcs[v][i]==1)return i;return -1;}bool visited[100];void DFS(MGraph G, int v){visited[v]=true;cout<<G.vexs[v]<<" ";for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))if(!visited[w])DFS(G, w);}void DFSTraverse(MGraph G)//深搜{for(int i=0; i<G.vexnum; i++)visited[i]=false;for(i=0; i<G.vexnum; i++)if(!visited[i])DFS(G, i);}void BFSTraverse(MGraph G)//广搜,类似于树的层次遍历{for(int i=0; i<G.vexnum; i++)visited[i]=false;queue<int> q;for(i=0; i<G.vexnum; i++){if(!visited[i]){visited[i]=true;q.push(i);while(!q.empty()){int v=q.front();q.pop();cout<<G.vexs[v]<<" ";for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w)){if(!visited[w]){visited[w]=true;q.push(w);}}}}}}void main(){MGraph g;CreateUDG(g);cout<<"深搜:";DFSTraverse(g);cout<<endl;cout<<"广搜:";BFSTraverse(g);cout<<endl;}



图的结构如下:

 

原创粉丝点击