现在的位置: 首页 > 综合 > 正文

xmu1073 选课

2013年08月14日 ⁄ 综合 ⁄ 共 1135字 ⁄ 字号 评论关闭

题目链接: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;
}

抱歉!评论已关闭.