• 实现图的基本操作


    要求:建立图(邻接矩阵、邻近表任选其一)的存储结构、实现图的深度优先遍历和广度优先遍历。

    话不多说,代码贴上:

      1 #include <stdio.h>
      2 
      3 #include<iostream>
      4 
      5 using namespace std;
      6 
      7 #define MAX_Point 26           // 最大顶点数
      8 
      9 int visited[MAX_Point];    // 遍历标志数组
     10 
     11 struct Graph
     12 
     13 {    
     14 
     15 char vexs[MAX_Point];           // 顶点表    
     16 
     17 int arc[MAX_Point][MAX_Point];      // 邻接矩阵    
     18 
     19 int numVertexs, numEdges;            // 图中当前的顶点数和边数 };
     20 
     21 void CreateGraph(Graph *graph)
     22 
     23 {    
     24 
     25 int i, j,k,io;
     26 
     27 //printf("输入顶点数:");    
     28 
     29 scanf("%d", &(graph->numVertexs));          // 接收输入的顶点数和边数,  
     30 
     31   // printf("输入顶点信息:");    
     32 
     33 for(i = 0; i < graph->numVertexs; i++)                             // 读入顶点信息,建立顶点表  
     34 
     35    {
     36 
     37         getchar();                                                 // 清空键盘输入缓冲区        
     38 
     39        scanf("%c", &(graph->vexs[i]));    
     40 
     41    }
     42 
     43 for(i = 0; i < graph->numVertexs; i++)    
     44 
     45 {        
     46 
     47        for(j = 0; j < graph->numVertexs; j++)  
     48 
     49        {           
     50 
     51           graph->arc[i][j] = 0;                            // 邻接矩阵初始化       
     52 
     53        }    
     54 
     55 }   
     56 
     57 // printf("输入边数:");    
     58 
     59 scanf("%d", &(graph->numEdges));
     60 
     61     //printf("输入边上的顶点,分别用空格分隔:");  
     62 
     63    for(k = 0; k < graph->numEdges; k++)                               // 读入numEdges条边,建立邻接矩阵  
     64 
     65    {
     66 
     67         getchar();                                                 // 清空键盘输入缓冲区        
     68 
     69        scanf("%d %d %d", &i, &j,&io);        
     70 
     71        graph->arc[i][j] =  io;        
     72 
     73        graph->arc[j][i] = graph->arc[i][j];                           // 因为是无向图,矩阵对称   
     74 
     75     }
     76 
     77 }
     78 
     79 void DFS(Graph graph, int i)
     80 
     81 {    
     82 
     83    int j;    
     84 
     85    visited[i] = 1;                   // 标志已经被遍历过了    
     86 
     87    printf("%c ", graph.vexs[i]);
     88 
     89     for(j = 0; j < graph.numVertexs; j++)   
     90 
     91   {         // 如果与第i个顶点相邻接且该顶点还没有被遍历过,则对邻接顶点递归调用       
     92 
     93       if(graph.arc[i][j]!=0 && !visited[j])        
     94 
     95        {            
     96 
     97          DFS(graph, j);       
     98 
     99          }    
    100 
    101    }
    102 
    103 }
    104 
    105 void DFSTraverse(Graph graph)
    106 
    107 {    
    108 
    109     cout<<"DFS:";   
    110 
    111     int i;    
    112 
    113    for(i = 0; i < graph.numVertexs; i++)  
    114 
    115    {         // 初始所有顶点都是未被遍历过的状态     
    116 
    117        visited[i] = 0;   
    118 
    119     }   
    120 
    121   for(i = 0; i < graph.numVertexs; i++)   
    122 
    123   {         // 对未访问过的顶点调用DFS,若是连通图,只会执行一次     
    124 
    125        if(!visited[i])      
    126 
    127        {           
    128 
    129           DFS(graph, i);  
    130 
    131        }    
    132 
    133    }   
    134 
    135   cout<<endl; }
    136 
    137 //广度遍历
    138 
    139 void BFS(Graph graph, int i)
    140 
    141 {    
    142 
    143     int j;    
    144 
    145     visited[i] = 1;                   // 标志已经被遍历过了    
    146 
    147     printf("%c ", graph.vexs[i]);
    148 
    149     for(j = 0; j < graph.numVertexs; j++)
    150 
    151    {         // 如果与第i个顶点相邻接且该顶点还没有被遍历过,则对邻接顶点递归调用      
    152 
    153         if(graph.arc[i][j] !=0 && !visited[j])       
    154 
    155    {             //BFS(graph, j);            
    156 
    157         visited[j] = 1;                   // 标志已经被遍历过了          
    158 
    159          printf("%c ", graph.vexs[j]);
    160 
    161         }    
    162 
    163    }
    164 
    165 }
    166 
    167 void BFSTraverse(Graph graph)
    168 
    169 {    
    170 
    171       cout<<"BFS:";    
    172 
    173       int i;    
    174 
    175       for(i = 0; i < graph.numVertexs; i++)    
    176 
    177      {         // 初始所有顶点都是未被遍历过的状态    
    178 
    179          visited[i] = 0;   
    180 
    181       }    
    182 
    183     for(i = 0; i < graph.numVertexs; i++)   
    184 
    185      {         // 对未访问过的顶点调用BFS,若是连通图,只会执行一次      
    186 
    187           if(!visited[i])        
    188 
    189           {            
    190 
    191             BFS(graph, i);      
    192 
    193            }    
    194 
    195      }    
    196 
    197       cout<<endl;
    198 
    199 }
    200 
    201 char change(int i)
    202 
    203 {    
    204 
    205     char chng;  
    206 
    207     switch(i)    
    208 
    209    {    
    210 
    211    case 0:         chng='a';         break;    
    212 
    213    case 1:         chng='b';         break;    
    214 
    215    case 2:         chng='c';         break;    
    216 
    217    case 3:          chng='d';         break;    
    218 
    219    case 4:         chng='e';         break;    
    220 
    221    case 5:         chng='f';         break;    
    222 
    223    case 6:         chng='g';         break;    
    224 
    225    case 7:         chng='h';         break;    
    226 
    227    case 8:         chng='i';         break;    
    228 
    229    case 9:         chng='j';         break;    
    230 
    231    }   
    232 
    233   return chng;
    234 
    235 }
    236 
    237 void show(Graph graph) {  
    238 
    239    cout<<"edges are:"<<endl;  
    240 
    241    for(int i = 0; i < graph.numVertexs; i++)   
    242 
    243    {        
    244 
    245          for(int j = i+1; j < graph.numVertexs; j++)      
    246 
    247         {   
    248 
    249               if(graph.arc[i][j]!=0)
    250 
    251              {
    252 
    253                 cout<<change(i)<<"-"<<change(j)<<":"<<graph.arc[i][j]<<endl;           
    254 
    255               }    
    256 
    257         }    
    258 
    259     }
    260 
    261 }
    262 
    263  
    264 
    265 int main()
    266 
    267 {    
    268 
    269      Graph graph;    
    270 
    271     CreateGraph(&graph);  
    272 
    273     DFSTraverse(graph);    
    274 
    275     BFSTraverse(graph);    
    276 
    277     show(graph);    
    278 
    279     return 0;
    280 
    281 }
  • 相关阅读:
    bzoj1208 宠物收养所treap/splay/set
    Angular 下的 function
    argunlar 1.0.1 【数据绑定】
    argunlar 1.0.0 【hello,world】
    JavaScript编写风格指南 (三)
    JavaScript编写风格指南 (二)
    JavaScript编写风格指南 (一)
    AngularJS开发指南:表达式
    HTML5 移动开发(移动设备检测及对HTML5的支持)
    HTML5 移动开发(CSS3设计移动页面样式)
  • 原文地址:https://www.cnblogs.com/jiangnanyanyuchen/p/5661659.html
Copyright © 2020-2023  润新知