拓扑排序

    xiaoxiao2022-07-14  156

    #include<iostream> #include<cstdlib> #include<cstring> using namespace std; #define maxSize 100 //边表 typedef struct ArcNode { int adjvex; //该边所指向的结点的位置 struct ArcNode *nextarc; //指向下一条边的指针 int info; //该边的相关信息(如权值) }ArcNode; //顶点表 typedef struct { char data; //顶点信息 int count; ArcNode *firstarc; //指向第一条边的指针 }VNode; typedef struct { VNode adjlist[maxSize]; //邻接表 int n,e; //顶点数和边数 }AGraph; void Create(AGraph *G) { cout<<"请输入顶点数和边数:"<<endl; cin>>G->n>>G->e; cout<<"输入顶点信息:"<<endl; for(int i=0;i<G->n;i++) { getchar(); cin>>G->adjlist[i].data; G->adjlist[i].firstarc=NULL; //指向边表的指针初始时置为空 G->adjlist[i].count=0; } ArcNode *p; //建立边表 cout<<"输入边的下标:"<<endl; for(int k=0;k<G->e;k++) { int i,j; cin>>i>>j; G->adjlist[j].count++; p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j; //存储弧头 p->nextarc=G->adjlist[i].firstarc; //头插法插入边结点 G->adjlist[i].firstarc=p; } } int TopSort(AGraph *G) { int i,j,n=0; int stack[maxSize],top=-1; ArcNode *p; for(i=0;i<G->n;++i) if(G->adjlist[i].count==0) stack[++top]=i; while(top!=-1) { i=stack[top--]; ++n; cout<<i<<" "; p=G->adjlist[i].firstarc; while(p!=NULL) { j=p->adjvex; --(G->adjlist[j].count); if(G->adjlist[j].count==0) stack[++top]=j; p=p->nextarc; } } if(n==G->n) return 1; else return 0; } /* 7 11 a b c d e f g 0 1 0 2 0 3 1 2 1 4 2 5 2 4 3 5 4 6 5 4 5 6 */ int main() { AGraph G; Create(&G); TopSort(&G); }

     

    最新回复(0)