zoukankan      html  css  js  c++  java
  • 6)图[1]之邻接矩阵存储[深度遍历和广度遍历]

      1 #include "iostream"
      2 #include "queue"
      3 using namespace std;
      4 
      5 const int MaxNumVertex  = 100; //最大顶点数
      6 typedef int elementtype;       //elementtype 为int 型
      7 class graph{
      8 public:
      9     graph();
     10     ~graph();
     11     elementtype insertvertex(elementtype v); //在图中增加一个顶点
     12     elementtype deletevertex(elementtype v); //在图中删除一个顶点
     13     elementtype insertedge(elementtype v,elementtype u);//在图中增加一条从v顶点到u顶点的弧
     14     elementtype deleteedge(elementtype v,elementtype u);//]在图中删除一条从v顶点到u顶点的弧
     15     elementtype dfs(elementtype v);//从v顶点出发进行深度优先遍历
     16     elementtype bfs(elementtype v);//从v顶点出发进行广度优先遍历
     17     elementtype travel_dfs();//深度优先遍历图
     18     elementtype travel_bfs();//广度优先遍历图
     19     elementtype locatevertex(elementtype v);//求顶点v在图g中的位序
     20     elementtype firstadj(elementtype v);//求图g中顶点v的第一个邻接点
     21     elementtype nextadj(elementtype v,elementtype m);//求图中顶点v的m邻接点之后的邻接点
     22     elementtype degree(elementtype v);//求图中顶点v的度数
     23 private:
     24     elementtype vertex[MaxNumVertex];//顶点表
     25     elementtype edge[MaxNumVertex][MaxNumVertex];//图中弧的类型
     26     int  CurrentVertex;//当前顶点数
     27     bool visited[MaxNumVertex];//顶点是否被访问
     28 };
     29 
     30 /*
     31 *初始化
     32 */
     33 graph::graph()
     34 {
     35     CurrentVertex = 0; 
     36     int i,j;
     37     for (i=MaxNumVertex-1;i>=1;i--)
     38     {
     39         for (j=MaxNumVertex-1;j>=1;j--)
     40         {
     41             edge[i][j] = 0;
     42 
     43         }
     44     }
     45     for (i=MaxNumVertex-1;i>=1;i--)
     46     {
     47         visited[i] = false;
     48     }
     49 }
     50 
     51 
     52 /*
     53 *在图中增加一个顶点
     54 */
     55 elementtype graph::insertvertex(elementtype v)
     56 {
     57     //判断这个顶点是否已经存在
     58     int i;
     59     bool flags = true;
     60     for(i=1; i<=CurrentVertex; i++)
     61     {
     62         if(vertex[i]==v)
     63         {
     64             flags = false;
     65             break;
     66         }
     67     }
     68     
     69     if(flags)
     70     {
     71         CurrentVertex++;
     72         vertex[CurrentVertex] = v;
     73     }else{
     74         cout<<v<<"顶点已经存在!"<<endl;
     75     }
     76     return 0;
     77 }
     78 
     79 /*
     80 *在图中删除一个顶点
     81 */
     82 elementtype graph::deletevertex(elementtype v)
     83 {
     84     int i,j;
     85     bool flags = true;
     86     for(i=1; i<=CurrentVertex; i++)
     87     {
     88         if(vertex[i]==v)
     89         {
     90             flags = false;
     91             j=i;
     92             while(j<CurrentVertex)
     93             {
     94                 vertex[j] = vertex[j+1];
     95                 j++;
     96             }
     97             
     98             CurrentVertex--;
     99         }
    100 
    101     }
    102     if(flags) cout<<v<<"顶点不存在!";
    103     return 0;
    104 }
    105 
    106 /*
    107 *在图中增加一条从v顶点到u顶点的弧
    108 */
    109 elementtype graph::insertedge(elementtype v,elementtype u)
    110 {
    111     if(edge[v][u]!=0)
    112     {
    113         cout<<v<<"->"<<u<<"这条弧弧已经存在!"<<endl;
    114     }else{
    115         edge[v][u] = 1;
    116     }
    117     return 0;
    118 }
    119 
    120 /*
    121 *在图中删除一条从v顶点到u顶点的额弧
    122 */
    123 elementtype graph::deleteedge(elementtype v,elementtype u)
    124 {
    125     if(edge[v][u]!=0)
    126     {
    127         edge[v][u] = 0;
    128     }else {
    129         cout<<v<<"->"<<u<<"这条弧不存在!"<<endl;
    130     }
    131     return 0;
    132 }
    133 
    134 /*
    135 *顶点v在图中的位序()???
    136 */
    137 elementtype graph::locatevertex(elementtype v)
    138 {
    139     int i,locate=0;
    140     for(i=1;i<=CurrentVertex; i++)
    141     {
    142         if(vertex[i]==v)
    143         {
    144             locate = i;
    145             break;
    146         }
    147     }
    148     return locate;
    149 }
    150 
    151 /*
    152 *求图中顶点v的第一个邻接点
    153 */
    154 elementtype graph::firstadj(elementtype v)
    155 {
    156     int u,i;
    157     bool flags = true;//用于判断是否存在邻接点
    158     for(i=1;i<=CurrentVertex;i++)
    159     {
    160         if(edge[v][i]!=0){
    161             u = i;
    162             flags = false;
    163             break;
    164         }
    165     }
    166     if(flags) u = 0;//邻接点不存在
    167     return u;
    168 }
    169 
    170 /*
    171 *求图中顶点v的m邻接点以后的邻接点
    172 */
    173 elementtype graph::nextadj(elementtype v,elementtype m)
    174 {
    175     int i,u;
    176     bool flags = true;
    177     for(i=m+1;i<=CurrentVertex;i++)
    178     {
    179         if(edge[v][i]!=0)
    180         {
    181             u = i;
    182             flags = false;
    183             break;
    184         }
    185     }
    186     if(flags) u = 0;//邻接点不存在
    187     return u;
    188 }
    189 
    190 /*
    191 *求图中顶点v的度数
    192 */
    193 elementtype graph::degree(elementtype v)
    194 {
    195     int i,num = 0;
    196     for (i=MaxNumVertex-1;i>=1;i--)
    197     {
    198         if(edge[v][i]!=0 || edge[i][v]!=0)num++;
    199     }
    200     return num;
    201 }
    202 /*
    203 *从v顶点出发进行深度优先遍历
    204 */
    205 elementtype graph::dfs(elementtype v)
    206 {
    207     int w;
    208     cout<<v<<"->";
    209     visited[v] = true;//访问顶点v,并设置其访问标志
    210     w = firstadj(v);//求出v的第一个邻接点
    211     while(w!=0)
    212     {
    213         if(visited[w]==false)//顶点w还没有被访问
    214         {
    215             dfs(w);
    216         }
    217         w = nextadj(v,w);
    218     }
    219     return 0;
    220 }
    221 
    222 /*
    223 *深度遍历整个图;保证访问到所有结点
    224 */
    225 elementtype graph::travel_dfs()
    226 {
    227     int i;
    228     for(i=1;i<=CurrentVertex;i++)visited[i] = false;
    229     for(i=1;i<=CurrentVertex;i++)
    230     {
    231         if(visited[i]==false) dfs(i);
    232     }
    233     return 0;
    234 }
    235 
    236 /*
    237 *广度有限遍历
    238 */
    239 elementtype graph::bfs(elementtype v0)
    240 {
    241     int w,x,v;
    242     queue<elementtype>q;
    243     visited[v0] = true;
    244     cout<<v0<<"->";
    245     q.push(v0);
    246     while(!q.empty())
    247     {
    248         x=q.front();
    249         v=x;
    250         q.pop();
    251         w=firstadj(v);
    252         while(w!=0)
    253         {
    254             if(!visited[w])
    255             {
    256                 visited[w] = true;
    257                 cout<<w<<"->";
    258                 q.push(w);
    259             }
    260             w = nextadj(v,w);
    261         }
    262     }
    263     return 0;
    264 }
    265 
    266 /*
    267 *广度优先遍历
    268 */
    269 elementtype graph::travel_bfs()
    270 {
    271     int i;
    272     for(i=1;i<=CurrentVertex;i++)visited[i] = false;
    273     for(i=1;i<=CurrentVertex;i++)
    274     {
    275         if(visited[i]==false) bfs(i);
    276     }
    277     return 0;
    278 }
    279 graph::~graph()
    280 {
    281 }
    282 int main()
    283 {
    284     graph g;
    285     int i,numv,v,u,w;
    286     cout<<"请输入顶点数:";
    287     cin>>numv;
    288     cout<<"请依次输入顶点:";
    289     for(i=1;i<=numv;i++)
    290     {
    291         cin>>v;
    292         g.insertvertex(v);
    293     }
    294 
    295     cout<<"请输入弧的数目:";
    296     cin>>numv;
    297     
    298     for(i=1;i<=numv;i++)
    299     {
    300         cout<<"u->w:";
    301         cin>>u>>w;
    302         g.insertedge(u,w);
    303     }
    304 
    305     cout<<"深度遍历结果dfs:";
    306     g.travel_dfs();
    307     cout<<endl;
    308 
    309     cout<<"广度遍历结果bfs:";
    310     g.travel_bfs();
    311     cout<<endl;
    312     return 0;
    313 }

     

  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/minmsy/p/4963367.html
Copyright © 2011-2022 走看看