吊带裤小熊 2015-12-27 15:12 采纳率: 0%
浏览 1707

拓扑排序(c++)不太懂,有没有大神,求教

最近要写拓扑排序的程序,然后作为一名渣渣,并不是特别懂。课本上说的只说了大致的,我只知道它的思想,却写不出程序来。有没有大神愿意教我(*´ο`*)

  • 写回答

2条回答 默认 最新

  • threenewbee 2015-12-27 15:17
    关注

    有向图可以拓扑排序的条件是:图中没有环。
    具体方法:
    ⑴ 从图中选择一个入度为0的点加入拓扑序列。
    ⑵ 从图中删除该结点以及它的所有出边(即与之相邻点入度减1)。
    反复执行这两个步骤,直到所有结点都已经进入拓扑序列。

     #include <iostream>
    #include <fstream>
    #include <stack>
    using namespace std;
    
    ifstream fin("in.txt");
    #define MAX_VERTEX_NUM 26
    
    stack<int> s;
    
    typedef struct ArcNode{
        int adjvex;
        struct ArcNode *nextarc;
        ArcNode(){nextarc=0;}
    //  InfoType *info;
    }ArcNode;
    
    typedef struct VNode{
        int data;
        ArcNode *firstarc;
        VNode(){firstarc=0;}
    }VNode,AdjList[MAX_VERTEX_NUM];
    
    typedef struct{
        AdjList vertices;
        int vexnum,arcnum;
        int kind;
    }ALGraph;
    
    bool TopologicalSort(ALGraph G,int *indegree)
    {
        int i,k;
        for(i=1;i<G.vexnum+1;i++)
        {
            if(!indegree[i]){s.push(i);}
        }
        int count=0;
        ArcNode *p;
        while(!s.empty())
        {
            i = s.top();
            s.pop();
            cout<<G.vertices[i].data<<"-->";
            count++;
            for(p=G.vertices[i].firstarc;p;p=p->nextarc)
            {
                k = p->adjvex;
                indegree[k]--;
                if(!indegree[k])s.push(k);
            }
        }
        if(count<G.vexnum) return false;
        return true;
    }
    
    
    int main()
    {
        int i;
        ALGraph g;
        cout<<"输入节点数和边数: ";
        fin>>g.vexnum>>g.arcnum;
        for(i=1;i<g.vexnum+1;i++)
            g.vertices[i].data = i;
    
        int b,e;
        ArcNode *p;
        int *indegree = new int[g.vexnum+1];    
        //注意 int *a=new int(n);  申请一个整型变量空间,赋初值为n,并定义一个整型指针a指向该地址空间 
        //int *indegree=(int *)malloc(sizeof(int)*(g.vexnum+1));
        memset(indegree,0,sizeof(int)*(g.vexnum+1));
        cout<<"逐一输入边的顶点对,形如 3 5 "<<endl;
        for(i=1;i<g.arcnum+1;i++)
        {
            cout<<"第"<<i<<"条边:";
            fin>>b>>e;
            p = new ArcNode();
            p->adjvex = e;
            p->nextarc = g.vertices[b].firstarc;
            g.vertices[b].firstarc = p;
            indegree[e]++;
            cout<<endl;
        }
        if(TopologicalSort(g,indegree))cout<<"正常完成!"<<endl;
        else cout<<"该有向图有回路!"<<endl;
        return 0;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?