拓扑排序

来源:互联网 发布:程序员自我评价怎么写 编辑:程序博客网 时间:2024/04/30 10:08
#include<iostream>#include<cstring>#include<stack>#define maxn 100using namespace std;stack<int>s;int indegree[maxn];struct node{int adjvex;node *next;}adj[maxn*maxn];void Create(int n,int m)//n  顶点数  m 边数{node *p;for(int i=1;i<=n;i++){adj[i].adjvex=i;adj[i].next=NULL;}int u,v;for(int j=1;j<=m;j++){cout<<"请输入第"<<j<<"条边: ";cin>>u>>v;p=new node;        p->adjvex=v;        p->next=adj[u].next;        adj[u].next=p;}}void Print(int n)//打印邻接表{node *p;for(int i=1;i<=n;i++){p=&adj[i];while(p!=NULL){cout<<p->adjvex<<" ";p=p->next;}cout<<endl;}}void TopSort(int n){int i;memset(indegree,0,sizeof indegree);node *p;for( i=1;i<=n;i++){p=adj[i].next;while(p!=NULL){int v=p->adjvex;indegree[v]++;p=p->next;}}for(i=1;i<=n;i++)if(!indegree[i])s.push(i);int count=0;while(!s.empty()){i=s.top();s.pop();cout<<i<<" ";count++;for(p=adj[i].next;p!=NULL;p=p->next){int k=p->adjvex;indegree[k]--;if(!indegree[k])s.push(k);}}cout<<endl;if(count<n)cout<<"有回路!"<<endl;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int n,m;    cout<<"请输入AOV网的顶点数,及边数"<<endl;    cin>>n>>m;    Create(n,m);    cout<<"输入的邻接表为:"<<endl;    Print(n);    cout<<"拓扑排序结果为:"<<endl;    TopSort(n);    return 0;}

0 0
原创粉丝点击