• 数据结构与算法


    题型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);
                        }
                    }
                }
            }
        }
    }
    复制代码
  • 相关阅读:
    Rails坑之 gem 'pg', '0.15.1' 安装报错
    Ruby常用文件操作
    Linux各个目录浅析
    Ruby一行代码实现快速排序
    调试常用的方法
    Ruby实现冒泡排序
    Ruby代理例子
    新建一个包,并生成可以直接在命令行执行的指令
    Linux定时任务Crontab命令详解
    php安装完后配置php.ini和php-fpm.conf
  • 原文地址:https://www.cnblogs.com/alantu2018/p/8460832.html
Copyright © 2020-2023  润新知