• 图—拓扑排序


    对象:有向图(有无权无所谓)

    存储方式:邻接表(最好写罢了,空间也比较少)

    核心代码:

    void topsort(adjgraph g)
    {
        int i,j;
        int visited[maxn]={0};
        int st[maxn],top=-1;
        arcnode *p;
        for(int i=0;i<g.n;i++)//初始化 
           g.adjlist[i].count=0;
        for(i=0;i<g.n;i++)//找到每个顶点vertex的入度 
        {
            p=g.adjlist[i].firstarc;
            while(p!=NULL)
            {
                g.adjlist[p->adjvex].count++;
                p=p->nextarc;
            }
        }
        for(i=0;i<g.n;i++)//度为零的进站 
           if(g.adjlist[i].count==0)
              st[++top]=i;
        while(top>-1)
        {
            i=st[top--];//出站 
            visited[i]++;//标记这个点已被访问 
            p=g.adjlist[i].firstarc;
            while(p!=NULL)//以此点i为入度的减一 
            {
                j=p->adjvex;
                g.adjlist[j].count--;
                if(g.adjlist[j].count==0)
                   st[++top]=j;
                p=p->nextarc;
            }
        }
        i=0;
        while(visited[i]&&i<g.n) i++;
        if(i==g.n)//全部访问 ,即无环 
           cout<<"YES
    ";
        else
           cout<<"NO
    "; 
        
    }
    View Code

    完整试例:

    #include<iostream>
    using namespace std;
    const int maxn=100;
    struct arcnode
    {
        int adjvex;
        arcnode *nextarc;
    };
    struct vnode
    {
        int count;
        arcnode *firstarc;
    };
    struct adjgraph
    {
        vnode adjlist[maxn];
        int n;
    };
    void make_adjgraph(adjgraph &g)
    {
        int m;
        cin>>m;
        for(int i=0;i<g.n;i++)
        {
            g.adjlist[i].firstarc=NULL;
        }
        for(int i=0;i<m;i++)
        {
            int a ,b;
            cin>>a>>b;
            arcnode *p=new arcnode;
            p->adjvex=b;
            p->nextarc=g.adjlist[a].firstarc;
            g.adjlist[a].firstarc=p;
        }
    }
    void topsort(adjgraph g)
    {
        int i,j;
        int visited[maxn]={0};
        int st[maxn],top=-1;
        arcnode *p;
        for(int i=0;i<g.n;i++)//初始化 
           g.adjlist[i].count=0;
        for(i=0;i<g.n;i++)//找到每个顶点vertex的入度 
        {
            p=g.adjlist[i].firstarc;
            while(p!=NULL)
            {
                g.adjlist[p->adjvex].count++;
                p=p->nextarc;
            }
        }
        for(i=0;i<g.n;i++)//度为零的进站 
           if(g.adjlist[i].count==0)
              st[++top]=i;
        while(top>-1)
        {
            i=st[top--];//出站 
            visited[i]++;//标记这个点已被访问 
            p=g.adjlist[i].firstarc;
            while(p!=NULL)//以此点i为入度的减一 
            {
                j=p->adjvex;
                g.adjlist[j].count--;
                if(g.adjlist[j].count==0)
                   st[++top]=j;
                p=p->nextarc;
            }
        }
        i=0;
        while(visited[i]&&i<g.n) i++;
        if(i==g.n)//全部访问 ,无环 
           cout<<"YES
    ";
        else
           cout<<"NO
    "; 
        
    }
    int main()
    {
        adjgraph g;
        while(cin>>g.n&&g.n)
        {
          make_adjgraph(g);
          topsort(g);
        }
        return 0;
    }
    View Code

    例题地址:http://tk.hustoj.com/problem.php?id=2138

  • 相关阅读:
    基于协程实现并发的套接字通信
    基于tcp协议的套接字通信:远程执行命令
    Java开发中的23种设计模式详解(转)
    SonarLint实践总结
    Java代码规范与质量检测插件SonarLint
    ES的基本介绍和使用
    ES基本介绍(简介)
    弗洛伊德追悼会 事发地市长跪在灵柩前大哭
    阿里云部署Web项目
    SpringBoot上传图片无法走复制流
  • 原文地址:https://www.cnblogs.com/shenyuling/p/9997065.html
Copyright © 2020-2023  润新知