数据结构—拓扑排序

杀马特。学长 韩版系。学妹 提交于 2019-12-24 13:27:40
#include<iostream>
#define OK 1
using namespace std;
const int MAX=1e5;
const int maxn=1e2+10;
const int dot=11;//点的个数; 
int aov[maxn][maxn];//存图;
int voa[maxn][maxn];//逆邻接表; 
int vis[maxn];//存每个点的入度;
int dis[maxn];//存拓扑序列; 
typedef int status;
typedef int person;  
typedef struct
{
	int *base;
	int front;
	int rear;
}squeue;
squeue Mdancer,Fdancer;
void initqueue(squeue &Q)//建立 
{
	Q.base=new person[MAX];
	Q.front=Q.rear=0;
}
void enqueue(squeue &Q,int &e)		//入队 
{
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAX;
}
void dequeue(squeue &Q,int &e)			//出队 
{
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAX;
}
person gethead(squeue Q)			//队头元素 
{
	if(Q.front!=Q.rear) return Q.base[Q.front]; 
}
status queueempty(squeue Q) 		//判断队列是否为空 
{
	if(Q.front!=Q.rear)
		 return 0;
	else 
		return OK;
}
void cou()
{
	cout<<"设计一个软件需要进行的一系列活动:"<<endl; 
	cout<<endl;
	cout<<"A1:用户需求分析"<<endl;
	cout<<"A2:系统需求确认"<<endl;
	cout<<"A3:系统概要设计"<<endl;
	cout<<"A4:设计用例场景"<<endl;
	cout<<"A5:系统的详细设计"<<endl;
	cout<<"A6:数据库详细设计"<<endl;
	cout<<"A7:编码"<<endl;
	cout<<"A8:单元测试"<<endl;
	cout<<"A9:集成测试"<<endl;
	cout<<"A10:系统测试"<<endl;
	cout<<"A11:维护"<<endl;
	cout<<"可使用额外的活动,A11,A12...等"<<endl;
	cout<<endl;
}
void cot()
{
	int n; 
	int x,y;
	cout<<"设计一个软件需要进行的系列活动之间的关系"<<endl;
	cout<<"请输入活动关系个数:"<<endl;
	cin>>n;
	cout<<"输如活动之间的关系:"<<endl; 
	cout<<"例如:完成活动A1需要先完成活动A2,则输入2 1:"<<endl;
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&x,&y);	
		while(!(x>=1&&x<=dot&&y>=1&&y<=dot))
		{
			cout<<"输入错误,请重新输入:"<<endl;
			scanf("%d%d",&x,&y);
		}	
		aov[x][y]=1;
		voa[y][x]=1; 
		vis[y]++;
	}
	cout<<endl;
	cout<<"aov邻接表为:"<<endl;
	for(int i=1;i<=dot;i++)
	{
		cout<<i<<":";
		for(int j=1;j<=dot;j++)
			if(aov[i][j])
				cout<<" "<<j;
		cout<<endl;
	}
	cout<<endl;
	for(int i=1;i<=dot;i++)
	{
		cout<<"完成A"<<i<<"需要先完成活动:";
		for(int j=1;j<=dot;j++)
			if(voa[i][j])
				cout<<" A"<<j;
		cout<<"共"<<vis[i]<<"个活动"<<endl; 
	} 
	cout<<endl;
}
int tp()//拓扑排序 
{
	squeue Q;
	int e;
	int k=0; 
	initqueue(Q);
	for(int i=1;i<=dot;i++)
	{
		if(!vis[i])
		{
			enqueue(Q,i);
		}
	}
	while(!queueempty(Q))
	{
		dequeue(Q,e);
		dis[k++]=e;
		for(int i=1;i<=dot;i++)
		{
			if(aov[e][i])
			{
				vis[i]--;
				if(!vis[i])
					enqueue(Q,i);	
			}
		}
	}
	return k;
}
int main()
{
	cou();
	cot();
	if(tp()==dot)
	{
		cout<<"拓朴序列为:";
		for(int i=0;i<dot;i++)
			cout<<"A"<<dis[i]<<", ";
	}
	else
		cout<<"该系列活动存在环"<<endl; 
	return 0;
}
/*
12
1 2
2 3
4 5
3 5
3 6
5 7  
6 7
7 8
7 10
8 9
9 11
10 11
*/ 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!