• 拓扑排序(判断有向图是否有回路)


    #include <iostream>  
    #include <queue>  
    #include <string>  
    using namespace std;  
      
    //表结点  
    typedef struct ArcNode{  
        int adjvex;//该弧所指向的顶点的位置   
        ArcNode *nextarc;  
    }ArcNode;  
      
    //头结点  
    typedef struct VNode{  
        string data;//顶点信息  
        ArcNode *firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针  
    }VNode, AdjList[10];  
      
    typedef struct ALGraph{  
        AdjList vertices;  
        int vexnum, arcnum;  
    }ALGraph;  
      
    int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置  
    {  
        for(int i=0; i<G.vexnum; i++)  
            if(G.vertices[i].data==u)  
                return i;  
        return -1;  
    }  
      
    void CreateDG(ALGraph &G)//构造有向图  
    {  
        string v1, v2;  
        int i, j, k;  
        cout<<"请输入顶点数和边数:";  
        cin>>G.vexnum>>G.arcnum;  
      
        cout<<"请输入顶点:";  
        for(i=0; i<G.vexnum; i++)  
        {  
            cin>>G.vertices[i].data;  
            G.vertices[i].firstarc=NULL;  
        }  
      
        cout<<"请输入边:"<<endl;  
        for(k=0; k<G.arcnum; k++)  
        {  
            cin>>v1>>v2;  
            i=LocateVex(G, v1);  
            j=LocateVex(G, v2);  
      
            ArcNode* arc=new ArcNode;  
            arc->adjvex=j;  
            arc->nextarc=G.vertices[i].firstarc;  
            G.vertices[i].firstarc=arc;  
        }  
    }  
      
    void FindIndegree(ALGraph G, int indegree[])//求顶点的入度  
    {  
        for(int i=0; i<G.vexnum; i++)  
            indegree[i]=0;  
      
        for(i=0; i<G.vexnum; i++)  
        {  
            ArcNode *p=G.vertices[i].firstarc;  
            while(p)  
            {  
                indegree[p->adjvex]++;  
                p=p->nextarc;  
            }  
        }  
    }  
      
    void TopologicalSort(ALGraph G)//拓扑排序  
    {  
        queue<int> q;  
        int indegree[10]={0};//入度数组  
        int count=0;//计数,计入队数  
      
        FindIndegree(G, indegree);  
      
        for(int i=0; i<G.vexnum; i++)//入度为0的顶点入队  
            if(0==indegree[i])  
                q.push(i);  
          
        while(!q.empty())  
        {  
            int v=q.front();  
            q.pop();  
            count++;  
            cout<<G.vertices[v].data<<" ";  
            ArcNode *p=G.vertices[v].firstarc;  
            while(p)//出队后,每个邻接点入度减1  
            {  
                if(!(--indegree[p->adjvex]))  
                        q.push(p->adjvex);//入度为0的顶点入队  
                p=p->nextarc;  
      
            }  
        }  
      
        if(count<G.vexnum)//由此判断有向图是否有回路  
            cout<<"该有向图有回路"<<endl;  
    }  
      
    void main()  
    {  
        ALGraph G;  
        CreateDG(G);  
      
        cout<<"拓扑排序:";  
        TopologicalSort(G);  
        cout<<endl;  
      
    }  

    测试用例一:

     

     

    测试用例二:


  • 相关阅读:
    随机数、无重复、冒泡排序
    今天是星期几
    Button
    2012/8/5为应用指定多个配置文件
    2012/8/4解决JSP显示中文乱码
    2012/8/4 struts2学习笔记
    2012/8/4Action中result的各种转发类型
    2012/8/4为Action属性注入值
    2012/8/3SVN小入门
    2012/8/3 Extjs使用TabPanel时需要注意的问题
  • 原文地址:https://www.cnblogs.com/tham/p/6827198.html
Copyright © 2020-2023  润新知