邻接矩阵 深度遍历

来源:互联网 发布:vb int函数的使用方法 编辑:程序博客网 时间:2024/05/16 10:21

建立无向图的不带权值的邻接矩阵,深度遍历简单路径

 

 

# include <iostream.h>

# include <stdio.h>

# include<string.h>

 

 

#define TRUE 1

#define FALSE 0

#define INFINITY INT_MAX    /*最大值“无穷”*/

#define MAX_VERTEX_NUM 20   /*最大顶点个数*/

typedef int Boolean;

typedef char VertexType[20];

typedef int VRType,InfoType;

 

 

typedef struct  ArcCell//定义无权值无向图

{

         VRTypeadj; /*图中有1/0表示是否有边,网中表示边上的权值*/

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

 

typedef struct

{

         VertexTypevexs[MAX_VERTEX_NUM];/*顶点向量*/

         AdjMatrixarcs;/*邻接矩阵*/

         intvexnum,arcnum; /*图中当前顶点数和边数*/

 

}MGraph;

 

 

int LocateVertex(MGraph G,VertexType v)/* 顶点在顶点向量中的定位*/

{

         inti=0;

         while((strcmp(v,G.vexs[i])!=0))

                   i++;

         returni;

}

void GetArc(VertexType u,VertexType v)//输入一条弧<u,v>

{

         cout<<"请输入一条弧:";

         cin>>u>>v;

}

 

void CreateGraph(MGraph *&G)/*建立无向图的邻接矩阵*/

{

         inti,j,k; //i,j,k为计数器

         VertexTypev1,v2; //用于放置输入的弧的两个顶点  

         printf("请输入无向图G的顶点数,边数: \n"); 

        

         cin>>G->vexnum>>G->arcnum;

         cout<<endl;

         cout<<"请输入"<<G->vexnum<<"个顶点的值(1个字符,空格隔开)"<<endl;

         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].adj=0;      

    }

   cout<<"请输入"<<G->arcnum<<"条边(以空格作为间隔)"<<endl;

         for(k=0;k<G->arcnum;k++)

         {

                   GetArc(v1,v2);//每次输入一条弧

                   i=LocateVertex(*G,v1); 

                   j=LocateVertex(*G,v2);

                   G->arcs[j][i].adj=1;

                   G->arcs[i][j].adj=G->arcs[j][i].adj;// 置<v1,v2>的对称弧<v2,v1>

                  

                   }

}

 

 

void PrintGraph(MGraph *G)

{

         inti,j;

         cout<<"MGraph"<<endl;

         for(i=0;i<G->vexnum;i++)

         {

                   cout<<G->vexs[i];

         for(j=0;j<G->vexnum;j++)

                   {

                            cout<<G->arcs[i][j].adj<<"";

                   }cout<<endl;

         }

}

int FirstAdj(MGraph *&G,int v)/* 查找第1个邻接点 */

{

         intj;

         intp=-1;

         for(j=0;j<G->vexnum;j++)

                   if(G->arcs[v][j].adj)

                   {p=j;break;

                   }

         returnp;

}

 

int NextAdj(MGraph *&G,int v,int w)/* 查找下一个邻接点 */

{

         intj;

         intp=-1;

         for(j=w+1;j<G->vexnum;j++)

                   if(G->arcs[v][j].adj)

                   {

                            p=j;break;

                   }

         returnp;

}

Boolean visited[MAX_VERTEX_NUM];

 

void DFS(MGraph *&G,int v)

{

         intw;

         visited[v]=TRUE;

         cout<<G->vexs[v];

         for(w=FirstAdj(G,v);w>=0;w=NextAdj(G,v,w))

         {

                   if(visited[w]==0)

                            DFS(G,w);

         }

}

 

void DFSTraverse(MGraph *&G)

{

         intv;

         for(v=0;v<G->vexnum;v++)

                   visited[v]=FALSE;

         for(v=0;v<G->vexnum;v++)

                   if(visited[v]==0)

                            DFS(G,v);

        

}

 

void main()

{

         MGraph*G=new MGraph;

 

         CreateGraph(G);

         PrintGraph(G);

         cout<<"G的简单路径为:";

         DFSTraverse(G);

         cout<<endl;

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脖子扭到了一动就疼怎么办 杭州限行在路上怎么办 在路上限行了怎么办 微信号不能进群怎么办 在微信约妹子被骗2000怎么办 qq号进不了热聊怎么办 网上买彩票中五百万怎么办 别人登我支付宝怎么办 医保刷卡刷到现金支付怎么办 微信诈骗立案后怎么办 奔跑吧诈骗填写了身份证怎么办 快手绑定的手机号丢了怎么办 球球大作战绑定手机号丢了怎么办 快手绑定手机号丢了怎么办 绑定银行卡的手机号丢了怎么办 爱奇艺绑定的手机号丢了怎么办 高铁票订错时间怎么办 微信音频视频打出没反应怎么办 海尔超低温保存箱低温报警怎么办 孕期吃了烧烤蔬菜怎么办 百姓动迁政府说话不算数怎么办 孕妇用了青草膏怎么办 药材不知道啥名怎么办 诛仙手游鸿蒙紫气不见了怎么办 紫叶兰叶干了怎么办 绿萝叶子中毒了怎么办? 怀孕初期胃疼的厉害怎么办 怀孕胃疼的厉害怎么办 天然气热水器风口一封闭怎么办 热水器着火后火变大怎么办? 人如果没有天魂怎么办 被鬼魂附体了该怎么办 被吸血蠓咬了怎么办 股份公司大股东占用资金怎么办 抱小孩抱的胳膊疼怎么办 一个月好几个性伴侣怎么办 惹了势力大的人怎么办 给佛像换新法器旧的怎么办 cad填充图案拾取不了点怎么办 cad填充图案太密怎么办 桃木葫芦挂件裂口了怎么办