数据结构 第六章学习小结

这周学的是图,既然是新的概念,首先要了解它的定义和基本术语,我们这里主要讲术语,包括但不限于有向图和无向图,邻接点,出度和入度,路径和路径长度,连通图和连通分量(这里重点讲一下)图中任意两个顶点属于V集合,则图是连通的,所谓连通分量,指的是无向图中的极大连通子图;对于有向图,就是它本身啊!!!不能再错了)

然后就是图的存储结构这里,主要有邻接矩阵和邻接表,邻接矩阵主要有两数组,顶点表和邻接矩阵,若有权值则需将矩阵中赋予相应的值;然后是邻接表,这里涉及到指针,在构建时,有3个结构体,我个人比较容易忘记是定点指针那里,还要多多回归课本。

 

对图的遍历主要有2种算法BFS和DFS;直接上代码:

void DFS_AM(AMGraph G, int v)
{  //图G为邻接矩阵类型 
  cout << v << " ";  //访问第v个顶点
  visited[v] = true;  
  for(w=0; w<G.vexnum; w++) //依次检查邻接矩阵v所在的行  
     if((G.arcs[v][w]!=0)&& (!visited[w]))  
         DFS_AM(G, w); //w是v的邻接点,如果w未访问,则递归调用DFS_AM 
} 

void DFSTraverse(Graph G)
{  // 对图 G 作深度优先遍历
  for(v=0; v<G.vexnum; ++v) 
     visited[v] = FALSE; //访问标志数组初始化
  for (v=G.vexnum-1; v>=0; --v) 
     if (!visited[v])  DFS(G, v);  //对尚未访问的顶点调用DFS
}

BFS,我个人不太熟,要多多看课本

void BFS(Graph &G, int j)
{//宽度优先分析
    visited[j] = true;
    queue<int> qu;
    qu.push(j);
    while(qu.size() != 0)
 {
        int mark = qu.front();
        qu.pop();
        cout<<mark<<" ";
        for(int i=0; i<G.Nnum; i++)
  {
            if(G.edges[i][mark] == 1 && visited[i] == false)
   {
                visited[i] = true;
                qu.push(i);
            }
        }
    }
 }

 

然后是最小生成树这里,有两个重要的方法,一个是不断找能构成最小权值的边的顶点,把他补充到集合U中。

posted @ 2020-06-14 23:58  20191003037魏云龙  阅读(141)  评论(0编辑  收藏  举报