第六章学习小结

一、内容小结

  与图相关的概念和术语比较多,比如:无向图&有向图、简单图&多重图、连通&强连通、无向&有向完全图等;还特别容易搞混各个字符的含义,需要多注意;算法也不是很好理解,好在这学期还不打算深入图的学习。

#define MaxInt 32767       //表示极大值, 即 OO
#define MVNum 100          //最大顶点数
typedef char VerTexType;   //假设顶点的数据类型为字符型
typedef int ArcType;       //假设边的权值类型为整型
typedef struct
{
    VerTexType vexs[MVNum];     //顶点表
    ArcType arcs[MVNum][MVNum];  //邻接矩阵
    int vexnum, arcnum;          //图的当前点数和边数
}AMGraph;
图的邻接矩阵存储表示
#define MVNum 100    //最大顶点数
typedef char VertexType;
typedef struct ArcNode   //边结点
{
    int adjvex;        //该边所指向的顶点的位置
    struct ArcNode *nextarc;  //指向下一条边的指针
    OtherInfo info;     //和边相关的信息
}ArcNode;
typedef struct VNode   //顶点信息
{
    VerTexType data;
    ArcNode *firstarc;   //指向第一条依附该顶点的边的指针
} VNode, AdjList[MVNum];  //AdjList表示邻接表类型
typedef struct         //邻接表
{
    AdjList vertices;
    int vexnum, arcnum;   //图的当前顶点数和边数
}ALGraph;
图的邻接表存储表示

  图的两种算法:DFS、BFS

void DFS_AM (AMGraph G, int v)
{//图G为邻接矩阵类型,从第v个顶点出发深度优先搜索遍历图G
    cout << v;
    visited[v] = 1;      //访问第v个顶点,并置访问标志数组相应分量值为1
    for(int w=0; w<G.vexnum; w++)      //依次检查邻接矩阵v所在的行
        if((G.arcs[v][w] != 0)&& (!visited[w])) 
            DFS_AM(G,w);     //G.arcs[v][w]!=0表示w是v的邻接点,如果w未访问,则递归调用DFS_AM
}
DFS_AM
//采用邻接表表示图的深度优先搜索遍历DFS
void DFS_ AL (ALGraph G, int v)
{//图G为邻接表类型,从第v个顶点出发深度优先搜索遍历图G
    cout << v;
    visited[v] = 1;   //访问第v个顶点,并置访问标志数组相应分量值为1
    int p = G.vertices[v].firstarc;     //p指向v的边链表的第一个边结点
    while (p!=NULL)
    {//边结点非空
        w = p->adjvex;//表示w是v的邻接点
        if(!visited[w]) 
            DFS(G, w);//如果w未访问,则递归调用DFS
        p = p->nextarc;//p指向下一个边结点
    }
}
DFS_AL
void BFS_AM(AMGraph G, int v)
{//按广度优先非递归遍历连通图G
    visited_BFS[v] = 1; 
    queue<int> Q; 
    Q.push(v);//v进队
    while(Q.size() != 0)  //队列非空
    {
        int front = Q.front();
        Q.pop();  //队头元素出队
        cout << front  << " ";
         for(int i=0; i<G.vexnum; i++)
         {
            if(G.arcs[i][front] == 1 && visited_BFS[i] == 0)
            {
                visited_BFS[i] = 1;
                Q.push(i);
            }
        }
    }
}
BFS_AM
BFS_AL

  最小生成树(Prim算法、Kruskal算法)、最短路径(Dijkstra算法、Floyd算法)、拓扑排序、关键路径,前面两个课堂上老师讲完后理解起来容易些,后两个看视频看书还是有点懵,大概懂了思路,算法略微吃力。

 

二、注意点

1、关于动态非配的数组与静态数组的初始化

如果这样初始化,是错的:

bool *check = new bool[n+1]{false}; //只初始化了check[0]

应改为  bool *check = new bool[n+1](0); //申请动态空间并初始化

如果这样初始化,是对的:

bool check[100001] = {false}; //没有被显式初始化的元素,被初始化为相应类型的默认值。

2、使用邻接矩阵a存储无向网络,若i号顶点与j号顶点之间不存在边,则a[i][j]值为多少,你是怎么分析的?

参考(1):若权值是一个正整数,可以设为0或负数。若权值是整数,则设为一个大于所有边权值的数。(不只是无穷)

参考(2): a[i][j]=无穷(也指代计算机允许的、大于所有边上权值的数),在邻接矩阵存储无向网络的时候,初始的时候先将每个顶点即每一行的权值都初始化为无穷。在输入数据的时候,再根据给定的权值,对二维数组对应的空间进行值替换,此时显示的值即为新的权值。不存在边的话,在我们遍历的时候,得到的就是无穷了。

3、对于连通图,其连通分量就是它本身(做题时注意看清前提)。

4、实践题的距离计算函数一开始没想好写得比较绕,还有的是要用辅助数组和定义全局变量,这两个要学起来。

posted @ 2020-06-14 21:36  杨璇  阅读(222)  评论(0)    收藏  举报