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 }

     

  • 相关阅读:
    Vmware 6.5:vmware vm高可用-vSphere HA & Fault Tlerance
    Redis 3.2.3: 集群3哨兵模式
    Mysql 5.7.18:主从复制,io优化
    Centos 7 x64 系统初始化
    javascript小实例,阻止浏览器默认行为,真的能阻止吗?支持IE和标准浏览器的阻止默认行为的方法
    javascript小实例,移动端页面中的拖拽
    javascript小实例,PC网页里的拖拽
    javascript小实例,在页面中输出当前客户端时间
    javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数
    javascript小实例,多种方法实现数组去重问题
  • 原文地址:https://www.cnblogs.com/minmsy/p/4963367.html
Copyright © 2011-2022 走看看