zoukankan      html  css  js  c++  java
  • 拓扑排序

    编程语言:c++

    截图展示:

    代码如下:

      1 #include<cmath>
      2 #include<cstdio>
      3 #include<algorithm>
      4 #include<stack>
      5 #include<memory.h>
      6 #include<iostream>
      7 using namespace std;
      8 #define MAX 9999
      9 
     10 stack<int>mystack;
     11 int indegree[MAX];
     12 
     13 struct node
     14 {
     15     int adjvex;
     16     node* next;
     17 }adj[MAX];
     18 
     19 int Create(node adj[],int n,int m)//邻接表建表函数,n代表定点数,m代表边数
     20 {
     21     int i;
     22     node *p;
     23     for(i=1;i<=n;i++)
     24     {
     25 
     26         adj[i].adjvex=i;
     27         adj[i].next=NULL;
     28     }
     29     for(i=1;i<=m;i++)
     30     {
     31         cout<<"请输入第"<<i<<"条边:";
     32         int u,v;
     33         cin>>u>>v;
     34         p=new node;
     35         p->adjvex=v;
     36         p->next=adj[u].next;
     37         adj[u].next=p;
     38     }
     39     return 1;
     40 }
     41 
     42 
     43 void print(int n)//邻接表打印函数
     44 {
     45     int i;
     46     node *p;
     47     for(i=1;i<=n;i++)
     48     {
     49         p=&adj[i];
     50         while(p!=NULL)
     51         {
     52             cout<<p->adjvex<<' ';
     53             p=p->next;
     54         }
     55         cout<<endl;
     56     }
     57 }
     58 
     59 void topsort(node adj[],int n)
     60 {
     61 
     62     int i;
     63     node *p;
     64     memset(indegree,0,sizeof(indegree));
     65     for(i=1;i<=n;i++)
     66     {
     67 
     68         p=adj[i].next;
     69         while(p!=NULL)
     70         {
     71             indegree[p->adjvex]++;
     72             p=p->next;
     73         }
     74     }
     75     for(i=1;i<=n;i++)
     76     {
     77 
     78         if(indegree[i]==0)
     79             mystack.push(i);
     80     }
     81     int count=0;
     82     while(mystack.size()!=0)
     83     {
     84 
     85         i=mystack.top();
     86         mystack.pop();
     87         cout<<i<<' ';
     88         count++;
     89         for(p=adj[i].next;p!=NULL;p=p->next)
     90         {
     91             int k=p->adjvex;
     92             indegree[k]--;
     93             if(indegree[k]==0)
     94                 mystack.push(k);
     95         }
     96     }
     97     cout<<endl;
     98     if(count<n)cout<<"有回路"<<endl;
     99 }
    100 
    101 int main()
    102 {
    103     int n;
    104     int m;
    105     cout<<"请输入顶点数及边数:";
    106     cin>>n>>m;
    107     Create(adj,n,m);
    108     cout<<"输入的邻接表为:"<<endl;
    109     print(n);
    110     cout<<"拓扑排序结果为:"<<endl;
    111     topsort(adj,n);
    112     system("pause");
    113     return 0;
    114 }
  • 相关阅读:
    PHPStrom 转 VSCode 折腾记录
    vscode php 代码提示 自动完成
    Elasticsearch中文分词加拼音
    AutoMapper用法
    删除所有退出状态的容器
    Linux 安装Docker
    千里眼的修练方法--末法时代即将结束
    Visual NMP
    c#通过反射获取类上的自定义特性
    微信小程序学习笔记
  • 原文地址:https://www.cnblogs.com/llsq/p/7406312.html
Copyright © 2011-2022 走看看