zoukankan      html  css  js  c++  java
  • 无向图遍历

     大神:https://www.jianshu.com/p/e58665864d54

    DFS

    依次输入无向图的顶点个数、边的总条数以及每一条边,如0 1则表示顶点A和顶点B之间有边,然后创建该图的邻接矩阵的存储结构。请补充算法,对该图进行深度优先遍历,输出其遍历结果。

    输入:6   11
    0 1  0 5  1 5  0 3  5 3  0 2  2 3  5 4  3 4  0 4  2 4
    输出:ABFDCE 
     
      1 #include<iostream>
      2 using namespace std;
      3 #define UNVISITED 0
      4 #define VISITED 1
      5 
      6 class AdjMatrixUndirGraph
      7 {
      8 public:
      9     int vexNum, edgeNum;    // 顶点个数和边数
     10     int **Matrix;           // 邻接矩阵
     11     char *elems;            // 顶点数据
     12     bool *tag;
     13 
     14     AdjMatrixUndirGraph(char es[], int vertexNum);
     15     int FirstAdjVex(int v) ;          // 返回顶点v的第一个邻接点
     16     int NextAdjVex(int v1, int v2);   // 返回顶点v1的相对于v2的下一个邻接点
     17     void Display();                   // 图的输出
     18     void DFS(int v);                  // 深度遍历
     19 };
     20 
     21 AdjMatrixUndirGraph::AdjMatrixUndirGraph(char es[], int vertexNum)
     22 {
     23     vexNum = vertexNum;
     24     edgeNum = 0;
     25     elems = new char[vexNum];
     26     int u, v;
     27     for(v = 0; v < vexNum; v++)
     28     {  // 初始化标志数组
     29         elems[v] = es[v];
     30     }
     31 
     32     tag = new bool[vexNum];        // 生成标志数组
     33     for(v = 0; v < vexNum; v++)
     34     {  // 初始化标志数组
     35         tag[v] = UNVISITED;
     36     }
     37 
     38     Matrix = (int **)new int *[vexNum];// 生成邻接矩阵
     39     for (v = 0; v < vexNum; v++)
     40     {  // 生成邻接矩阵的行
     41         Matrix[v] = new int[vexNum];
     42     }
     43 
     44     for (u = 0; u < vexNum; u++)
     45     {
     46         for (v = 0; v < vexNum; v++)
     47         {  // 为邻接矩阵元素赋值
     48             Matrix[u][v] = 0;
     49         }
     50     }
     51 }
     52 
     53 int AdjMatrixUndirGraph::FirstAdjVex(int v)
     54 // 操作结果:返回顶点v的第1个邻接点
     55 {
     56     int k;
     57     for(k=0;k<vexNum;k++){
     58         if(Matrix[v][k]==1&&tag[k]==UNVISITED){
     59             return k;
     60         }
     61     }
     62     return -1;    // 返回-1表示无邻接点
     63 }
     64 
     65 int AdjMatrixUndirGraph::NextAdjVex(int v1, int v2)
     66 // 操作结果:返回顶点v1的相对于v2的下1个邻接点
     67 {
     68     int k;
     69     for(k=v2+1;k<vexNum;k++){
     70         if(Matrix[v1][k]==1&&tag[k]==UNVISITED){
     71             return k;
     72         }
     73     }
     74     return -1;    // 返回-1表示无邻接点
     75 }
     76 
     77 void AdjMatrixUndirGraph::Display()
     78 {
     79     int i,j;
     80      for(i=0;i<vexNum;i++){
     81         for(j=0;j<vexNum;j++){
     82             cout<<Matrix[i][j]<<" ";
     83         }
     84         cout<<endl;
     85      }
     86 }
     87 
     88 void AdjMatrixUndirGraph::DFS(int v)
     89 {        int w;//返回的是对应的数字 而不是顶点信息(ABCD啥的)
     90          cout<<elems[v];
     91          tag[v]=1;
     92          w=FirstAdjVex(v);//找到v的第一个临界点 找不到的话返回-1
     93          while(w!=-1){
     94             DFS(w);
     95             w=NextAdjVex(v,w);
     96          }
     97 
     98 }
     99 
    100 int main()
    101 {
    102     char vexs[] = {'A', 'B', 'C', 'D','E','F','G','H','I','J','K','L',
    103             'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    104     int n,t,i,x,y;
    105     cout<<"请输入无向图的顶点个数:";
    106     cin>>n;
    107     AdjMatrixUndirGraph g(vexs, n);//新建完毕
    108 
    109     cout<<"请输入边的总条数:";
    110     cin>>t;
    111     cout<<"请依次输入边,如0 1表示A和B之间有边:"<<endl;
    112     for (i = 1; i <=t; i++)
    113     {
    114         cin>>x>>y;
    115         g.Matrix[x][y]= g.Matrix[y][x]= 1;
    116     }
    117 
    118     cout << endl <<"原无向连通图的邻接矩阵如下:" << endl;
    119     g.Display();
    120     cout << endl;
    121 
    122     cout << "深度遍历序列为:" << endl;
    123     g.DFS(0);
    124     cout<<endl;
    125 
    126     return 0;
    127 }

    BFS

    有错误还没改不知道哪里出了问题

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #define MAX_NUM 100
      4 typedef struct Graph{
      5      char vexnum,arcnum;//顶点数,边数
      6      char vertex[MAX_NUM];//顶点信息数组
      7      int arcs[MAX_NUM][MAX_NUM];//邻接数组
      8 }Graph;
      9 bool visited[MAX_NUM];
     10 typedef struct{
     11      int data[MAX_NUM];//顺序队列 这是队列的元素空间
     12      int front;//头指针指示器
     13      int rear;//尾指针  注意啊这是int类型的
     14 }Queue;
     15 void InitQueue(Queue *Q){ //初始化队列
     16 
     17     Q->front=Q->rear=0;
     18 }
     19 void EnterQueue(Queue *Q,int e){
     20     int x;
     21      /*
     22      if((Q->rear+1)%MAX_NUM==Q->front){
     23         return false;
     24      }*/
     25      Q->data[Q->rear]=x;
     26      Q->rear=(Q->rear+1)%MAX_NUM;
     27 
     28 }
     29 void DeleteQueue(Queue *Q,int *x){
     30 
     31      *x=Q->data[Q->front];
     32      Q->front=(Q->front+1)%MAX_NUM;
     33 
     34 }
     35 int Empty(Queue Q){
     36 
     37     if(Q.front==Q.rear){
     38         return 1;//队列为空 返回真
     39     }
     40     else{ return 0;}
     41 
     42 }
     43 void CreateGraph(Graph *g){
     44       int i,j;
     45       int u,v;//输入的边的信息
     46 
     47       cout<<"输入顶点数和边数"<<endl;
     48       cin>>g->vexnum>>g->arcnum;
     49       for(i=0;i<g->vexnum;i++){
     50          visited[i]=false;//初始化判断数组都为false 所有点都未访问
     51       }
     52       cout<<"输入顶点信息数组"<<endl;
     53       for(i=0;i<g->vexnum;i++){
     54          cin>>g->vertex[i];//可以输入ABCDE了
     55       }
     56     //对邻接矩阵的 初始化 和有联系的点的信息化
     57       for(i=0;i<g->vexnum;i++){
     58         for(j=0;j<g->vexnum;j++){
     59             g->arcs[i][j]=0;//初始化邻接矩阵啦
     60         }
     61       }
     62       for(j=0;j<g->arcnum;j++){
     63          cout<<"请依次输入边,如0 1 表示A和B之间有边"<<endl;
     64          cin>>u>>v;
     65          g->arcs[u][v]=1;
     66          g->arcs[v][u]=1;//这样就联系起来啦 输入有联系的边的信息了
     67       }
     68 }
     69 int FirstVertex(Graph g,int v){//int类型哦
     70 
     71        int k=0;
     72        for(k=0;k<g.vexnum;k++){
     73           if(g.arcs[v][k]==1&&visited[k]==false){
     74              return k;
     75           }
     76        }
     77        return -1;
     78 }
     79 int NextVertex(Graph g,int v1,int v2){
     80 
     81           int k;
     82           for(k=v2+1;k<g.vexnum;k++){
     83               if(g.arcs[v1][k]==1&&visited[k]==false){
     84                   return k;
     85                }
     86           }
     87           return -1;
     88 }
     89 void BreadthFirstSearch(Graph *g,int v0){ //bfs遍历
     90          Queue Q;
     91          int v,i;
     92          visited[v0]=true;
     93          cout<<g->vertex[v0]<<" ";
     94          InitQueue(&Q);//初始化队列
     95          EnterQueue(&Q,v0);//向队列中插入元素
     96          /*while(!Empty(Q)){//为空返回真 此条件是判断队列不为空
     97             DeleteQueue(&Q,&v);//队首元素v出队
     98             w=FirstVertex(g,v);
     99             while(w!=-1){
    100                 if(!visited[w]){
    101                     visited[w]=1;
    102                     EnterQueue(&Q,W);
    103                 }
    104                 w=NextVertex(g,v,w);
    105             }
    106          }*/
    107          while(!Empty(Q)){
    108             DeleteQueue(&Q,&v);
    109             for(i=0;i<g->vexnum;i++){
    110                 if(g->arcs[v][i]==1&&visited[i]==false){
    111                     visited[i]=true;
    112                     cout<<g->vertex[i]<<" ";
    113                     EnterQueue(&Q,i);
    114                 }
    115             }
    116          }
    117 }
    118 //操作的是数字 输出的时候让数字对应vertex[]数组  vertex[0]=A
    119 void ShowGraph(Graph *g){
    120      cout<<"输出图的信息"<<endl;
    121      int i,j;
    122      for(i=0;i<g->vexnum;i++){
    123         for(j=0;j<g->vexnum;j++){
    124             cout<<g->arcs[i][j]<<" ";
    125         }
    126         cout<<endl;
    127      }
    128 }
    129 
    130 int main(){
    131 
    132      Graph *g;
    133      int i;
    134      g=(Graph*)malloc(sizeof(Graph));
    135      CreateGraph(g);
    136      for(i=0;i<g->vexnum;i++){
    137         BreadthFirstSearch(g,i);
    138         cout<<endl;
    139      }
    140      ShowGraph(g);
    141 }
  • 相关阅读:
    IE CSS Bug及解决方案参考手册
    如何学习Javascript
    JS获取当前对象大小以及屏幕分辨率等
    自适应网页设计的方法
    【Javascript Trick系列】二、table相关操作
    移动web开发经验总结
    兼容各种浏览器的常用按钮样式
    获取浏览器的高度和宽度
    让页面弹框垂直水平居中
    Vue is used in projects
  • 原文地址:https://www.cnblogs.com/yundong333/p/11023221.html
Copyright © 2011-2022 走看看