数据结构与算法——图论

简介: 题型1:拓扑排序 1)使用一个入度数组indegree来记录每个顶点的入度数,并使用一个变量来记录已经访问的顶点数 2)将入度为0的顶点压入栈中 3)将栈顶的元素删除。访问的顶点数加1.并将入该顶点相邻的所有顶点的入度数减1,如果减1之后的入度数为0,则将其压入栈中; 4)重复上面的过程,直到栈中的元素为空。

题型1:拓扑排序

1)使用一个入度数组indegree来记录每个顶点的入度数,并使用一个变量来记录已经访问的顶点数

2)将入度为0的顶点压入栈中

3)将栈顶的元素删除。访问的顶点数加1.并将入该顶点相邻的所有顶点的入度数减1,如果减1之后的入度数为0,则将其压入栈中;

4)重复上面的过程,直到栈中的元素为空。

5)判读访问的顶点数是否等于图的顶点数,看拓扑排序是否成功

实现代码:

status TopoLogicalSort(ALGraph G)
{
    //有向图G采用邻接表存储结构
    //若G无回路,则返回G的顶点的一个拓扑序列并返回OK,否则返回error
    finddegree(G,indegree);
    initstack(s);
    for(i=0;i<G.vexnum;++i)
        if(!indegree[i]) push(s,i);
    count=0;
    while(!stackempty(s))
    {
        pop(s,i);
        cout<<s<<' ';
        ++count;
        for(p=G.vetices[i].furstarc;p;p=p->next)
        {
            k=p->adjvex; 
            if(!(--indegree[k])) push(s,k);
        }
    }
    if(count<G.vexnum)
        cout<<error<<endl;
    else
        cout<<success<<endl;
}

2 深度优先遍历

int visited[N];
void DFS(Graph G,int v)
{
    visited[v]=1;
    cout<<v<<' ';
    for(w=firstAdjVex(G,v),w>=0;w=NextAdjVex(G,v,w))
    {
        if(!visited[w])
            DFS(G,w);
    }
}

void DFSsearch(Graph G)
{
    for(v=0;v<G.vexnum;++v)
        vistied[v]=0;
    for(v=0;v<G.vexnum;++v)
        DFS(G,v);
}

3 广度优先遍历

int visited[N];
void BFSsearch(Graph G)
{
    for(v=0;v<G.vexnum;++v)
        visited[v]=0;
    Initqueue(Q);
    for(v=0;v<G.vexnum;v++)
    {
        if(!visited[v])
        {
            visited[v]=1;
            cout<<v<<' ';
            Enqueue(Q,v);
            while(!QueueEmpty(Q))
            {
                DeQueue(Q,u);
                for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
                {
                    if(!visited[w])
                    {
                        visited[w]=1;
                        cout<<w<<' ';
                        EnQueue(Q,w);
                    }
                }
            }
        }
    }
}

 

 

 

相关文章
|
6月前
|
存储 算法 索引
数据结构与算法之图论及其相关算法
图的基本介绍 线性表局限于一个直接前驱和一个直接后继的关系,树也只能有一个直接前驱也就是父节点,当我们需要表示多对多的关系时, 这里我们就用到了图。 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图: 简单来说,图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。 然后我们说说图中的一些常见概念: 节点(Vertex):图中的基本元素,用于表示某个实体。 边(Edge):连接两个节点的线段,用于表示节点之间的关系。 度(Degree):
32 0
|
存储 人工智能 算法
数据结构与算法——图论基础与图存储结构 | 算法必看系列三十一
图是数据结构中重要内容。相比于线性表与树,图的结构更为复杂。在线性表的存储结构中,数据直接按照前驱后继的线性组织形式排列。在树的结构中,数据节点以层的方式排列,节点与节点之间是一种层次关系。但是,在图的结构中数据之间可以有任意关系,这就使得图的数据结构相对复杂。
|
1月前
|
存储 缓存 算法
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
|
28天前
|
存储 算法 Java
Java数据结构与算法-java数据结构与算法(二)
Java数据结构与算法-java数据结构与算法
82 1
|
28天前
|
XML 存储 算法
Java数据结构与算法-java数据结构与算法(五)
Java数据结构与算法-java数据结构与算法
48 0
|
30天前
|
存储 算法 搜索推荐
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点(二)
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点
94 2
|
30天前
|
存储 算法 C++
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点(一)
【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点
51 2
|
1月前
|
算法
【数据结构与算法】常用算法 前缀和
【数据结构与算法】常用算法 前缀和
|
1月前
|
存储 算法 搜索推荐
【数据结构与算法】【初学者也能学的数据结构与算法】迭代算法专题
【数据结构与算法】【初学者也能学的数据结构与算法】迭代算法专题

热门文章

最新文章