图-深度优先广度优先,以及邻接表的创建

来源:互联网 发布:2016淘宝最大的店铺 编辑:程序博客网 时间:2024/06/05 17:54

将上篇内容改成了C++版本,为了直接使用queue这个容器,只是为了自学而敲的

//#include <stdio.h>#include <iostream>#include <string>#include <queue>//#include <stdlib.h>//#include <curses.h>using namespace std;typedef char VertexType; //顶点类型用户自定义typedef int EdgeType;    //边上的权值类型用户自定义#define MAXVEX 100        //最大顶点数#define INFINITY 65535    //代表无穷大,用来表示不存在的边的权值为无穷大#define DEBUG#define MAXVEX 100typedef int Boolean;Boolean visited[MAXVEX];#define TRUE 1#define FALSE 0typedef struct{VertexType vexs[MAXVEX];  //顶点EdgeType arc[MAXVEX][MAXVEX];  //邻接矩阵int numVertexes, numEdges;     //顶点数,边数}Graph;//定位???int locates(Graph *g, char ch){int i = 0;for(i=0; i<g->numVertexes; i++){if(g->vexs[i]==ch){break;}}if(i>g->numVertexes){return -1;}return i;}void CreatGraph(Graph *g){int i, j, k, w;//printf("input num of vertexs, edges:\n");cout<<"input num of vertexs, edges:"<<endl;//scanf("%d, %d", &(g->numVertexes), &(g->numEdges));cin>>g->numVertexes>>g->numEdges;#ifdef DEBUG//printf("%d %d\n", g->numVertexes, g->numEdges);cout<<g->numVertexes<<' '<<g->numEdges<<endl;#endiffor(i = 0; i <g->numVertexes;i++){g->vexs[i] = getchar();//没看懂啊while(g->vexs[i]=='\n'){g->vexs[i] = getchar();}}#ifdef DEBUGfor(i = 0; i < g->numVertexes; i++){//printf("%c ", g->vexs[i]);        cout<<g->vexs[i]<<' ';}//printf("\n");cout<<endl;#endiffor(i = 0; i <g->numVertexes;i++){for(j=0; j<g->numVertexes;j++){            if(i==j)                g->arc[i][j]=0;g->arc[i][j]=INFINITY; //邻接矩阵初始化为无穷大}}for(k = 0; k<g->numEdges; k++){char p,q;//printf("input i , j of (vi, vj) and weight:\n");cout<<"input i, j of (vi,vj) and weight:"<<endl;p =getchar();while(p=='\n'){p=getchar();}q=getchar();while(q=='\n'){q=getchar();}//scanf("%d",&w);cin>>w;int m=-1;int n=-1;m=locates(g,p);n=locates(g,q);if(m==-1||n==-1){fprintf(stderr, "there is no this vertex.\n");return ;}g->arc[m][n]=w;//没有以下这句话就是有向图了g->arc[n][m]=g->arc[m][n]; //无向图,所以是对称的}}//打印无向图void printGraph(Graph *g){int i , j;for(i = 0; i<g->numVertexes;i++){for(j=0; j<g->numVertexes;j++){//printf("%10d ",g->arc[i][j]);cout<<g->arc[i][j]<<'          ';}//printf("\n");cout<<endl;}}//邻接矩阵的深度优先算法void DFS(Graph *g, int i){int j;visited[i] =TRUE;//printf("%c ", g->vexs[i]);cout<<g->vexs[i]<<endl;for(j = 0; j < g->numVertexes; j++){//已经确定没有关系的两定点之间权值用无限大表示if(g->arc[i][j]!=65535&&!visited[j]){DFS(g,j);}}}//邻接矩阵的深度遍历操作void DFSTraverse(Graph *g){int i;for(i = 0; i<g->numVertexes;i++){visited[i]=FALSE;}for(i = 0; i<g->numVertexes;i++){if(!visited[i]){DFS(g,i);}}}void BFSTraverse(Graph *g){int i,j;queue<char> q;for(i = 0; i<g->numVertexes;i++){visited[i]=FALSE;//初始化}//InitQueue(&q);for(i=0;i<g->numVertexes;i++){if(!visited[i]){visited[i]=TRUE;//printf("%c ",g->vexs[i]);cout<<g->vexs[i]<<endl;//EnQueue(&q,i);q.push(i);//while(!QueueEmpty(q)){while(!q.empty()){int m;//Dequeue(&q,&m);m=q.front();q.pop();for(j=0;j<g->numVertexes;j++){if(g->arc[m][j]!=65535&&!visited[j]){visited[j]=TRUE;//printf("%c ",g->vexs[j]);cout<<g->vexs[j]<<endl;//Enqueue(&q,j);q.push(j);}}}}}}int main(int argc, char ** argv){Graph g;CreatGraph(&g);    /*g.numVertexes = 5;    g.numEdges=6;    g.vexs[0]=0;    g.vexs[1]=1;    g.vexs[2]=2;    g.vexs[3]=3;    g.vexs[4]=4;g.vexs[5]={'0'};g.arc[5][5] = {65535};//g.arc[5][5]={65535,65535,65535,65535,6,9,65535,3,65535,65535,2,65535,65535,5,65535,65535,65535,65535,65535,1};*/cout<<"DFS:"<<endl;DFSTraverse(&g);//printf("\n");cout<<endl;cout<<"BFS:"<<endl;BFSTraverse(&g);//printGraph(&g);return 0;}


这是在网上找的一个示例图,接下来我们的输入按照这个来进行,下图是运行结果



阅读全文
0 0
原创粉丝点击