拓扑排序

来源:互联网 发布:经验模态分解 python 编辑:程序博客网 时间:2024/05/16 13:01
拓扑排序
// tuopupaixu.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>#include <iomanip>#include <stdio.h>using namespace std;typedef struct{char w1,w2;float w;}RCW;typedef struct {char *data;int *visited;int **edge;int max,size;}Graph;//初始化图结构void SetGraph(Graph*G,int n){int i,j;G->data=new char[n];G->visited=new int[n];//初始化边G->edge=(int**)malloc(n*sizeof(int*));for(i=0;i<n;i++)G->edge[i]=(int*)malloc(n*sizeof(int));for(j=0;j<n;j++)for(i=0;i<n;i++)G->edge[j][i]=0;//初始化访问标志for(i=0;i<n;i++) G->visited[i]=0;G->max=n;G->size=0;}//构造图void MakeGraph(Graph*G,RCW r[],int n/*点数*/,int e/*边数*/){//初始化顶点按字母顺序排列。    int m=0;while(m<n){if(G->size==G->max){cout<<"Graph is full"<<endl;}G->data[G->size]='a'+m;G->size++;m++;}//输入弧int p=0;while(p<e){int i,j,k;for(k=0;k<n;k++)    {  if(r[p].w1==G->data[k])i=k;if(r[p].w2==G->data[k])j=k;}G->edge[i][j]=r[p].w;p++;}} typedef struct { int *data; int max,top; }Stack; //判断是否无可处理点 bool isover(Graph*G) { for(int i=0;i<G->size;i++) { if(G->visited[i]==0) {return false;} } return true; } //判断一个节点是否有前驱 bool haspre(char a,Graph*G) {int k=0; for(int i=0;i<G->size;i++)//找到节点所在的列 if(a==G->data[i]) { k=a-'a'; } for(int i=0;i<G->size;i++) { if(G->edge[i][k]!=0) return true; } return false; } //清除前驱 void clearpre(char a,Graph*G) { int k=0; for(int i=0;i<G->size;i++)//找到节点所在的行 if(a==G->data[i]) { k=a-'a'; } for(int i=0;i<G->size;i++) { G->edge[k][i]=0; } }//拓扑排序算法void Sort(Graph*G,Stack&S){int i;(S.data)=new int[G->size];memset(S.data,0,G->size*sizeof(int));(S.max)=G->size; (S.top)=0;while(!isover(G)){for(i=0;i<G->size;i++) { if(!haspre(G->data[i],G)&&G->visited[i]==0)//无前驱,入栈 { (S.data[S.top])=G->data[i]-'a';  S.top++;  G->visited[G->data[i]-'a']=1;//标记为已访问过  //清除与它相连的点的依赖;  clearpre(G->data[i],G); } }}}int _tmain(int argc, _TCHAR* argv[]){cout<<"运行结果:\n";  Graph G;int n=6,e=8; //n为顶点数,e为边数  RCW rcw[8]={{'a','b',1},{'a','d',1},{'a','e',1},{'b','f',1},  {'c','b',1},{'c','f',1},{'e','d',1},{'e','f',1}};  SetGraph(&G,n);MakeGraph(&G,rcw,n,e);Stack S;Sort(&G,S );for (int i=0;i<G.size;i++){cout<<char(S.data[i]+'a')<<endl;}free(G.data);//释放空间  free(G.visited);  for(int i=0;i<G.max;i++) free(G.edge[i]);  free(G.edge);  cin.get();  return 0;}


0 0
原创粉丝点击