xmu1073 选课

题目链接:xmu1073

方法:拓扑排序

代码:

#include <iostream>
#include <stack>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int MAXNUM=505;//最大顶点数目 
typedef string type;
struct node
{
	type data;
	vector <int> next;//存储该顶点可以访问的顶点序号 
};
struct graph
{
	node vex[MAXNUM];//顶点信息 
	int vexnum,degree[MAXNUM];//顶点数目,顶点入度 
};
bool topsort(graph g)
{
	stack <int> s;
	int i,j,count=0,flag=1;
	int ans[MAXNUM];//记录拓扑排序后顶点的序号 
	for(i=0;i<g.vexnum;i++)
		if(!g.degree[i])s.push(i);
	while(!s.empty())
	{
		int tmp=s.top();s.pop();
		ans[count]=tmp; count++;
		for(i=0;i<g.vex[tmp].next.size();i++)
			if(!(--g.degree[g.vex[tmp].next[i]]))
				s.push(g.vex[tmp].next[i]);
	}
	if(count<g.vexnum)
	{
		cout<<"Impossible!"<<endl;
		return false;
	}
	else  
	{	for(i=0;i<g.vexnum;i++)
			if(i<g.vexnum-1)cout<<g.vex[ans[i]].data<<' ';
			else cout<<g.vex[ans[i]].data<<endl;
		return true;
	}
}
int main()
{
	int  n,m;
	while(cin>>n)
	{
		int i,j;
		graph g; g.vexnum=n;
		for(i=0;i<n;i++)cin>>g.vex[i].data;
		memset(g.degree,0,sizeof(g.degree));
		for(i=0;i<n;i++)
		{
			cin>>g.degree[i];
			for(j=0;j<g.degree[i];j++)
			{
				int tmp;
				cin>>tmp;tmp=tmp-1;//序号从0开始 
				g.vex[tmp].next.push_back(i);
				//由于是先修课程,应该是前面的课程可以访问该节点 
			}
		}
		bool res=topsort(g);
		/*if(res)cout<<"拓扑排序成功"<<endl;
		else cout<<"图中存在有环路"<<endl;*/
	}
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值