记录编号 35688 评测结果 AAAAAAAAAA
题目名称 课程安排问题 最终得分 100
用户昵称 Gravatarfeng 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2012-02-28 18:58:28 内存使用 0.46 MiB
显示代码纯文本
#include<fstream>
#include<algorithm>
using namespace std;
struct node {
	int s,next;
};
struct edge {
	int y,v,next,f;
};
int i,j,k,n,m,top,tmp,t,head,tail,min,sum=0,p,x,y;
edge e[101];
node a[101];
bool f[101];
bool q[101];
int queue[10000][5];
int ind[101];
int af[101];
void add(int x1,int y1,int v1)
{
	m++;
	a[x1].s=a[x1].s+1;
	e[m].y=y1;
	e[m].v=v1;
	e[m].next=a[x1].next;
	a[x1].next=m;
}
void swap(int x,int y)
{
	queue[0][1]=queue[x][1];
	queue[x][1]=queue[y][1];
	queue[y][1]=queue[0][1];
	queue[0][2]=queue[x][2];
	queue[x][2]=queue[y][2];
	queue[y][2]=queue[0][2];
}
int main()
{
	ifstream fin("curriculum.in");
	ofstream fout("curriculum.out");
	fin>>n;
	m=0;
	for (i=1;i<=n;i++)
		af[i]=0;
	for (i=1;i<=n;i++)
	{
		fin>>k;
		for (j=1;j<=k;j++)
		{
			fin>>y;
			x=i;
			add(y,x,1);
		}
	}
	for (i=1;i<=m;i++)
	{
		ind[e[i].y]++;
	}
	head=1;tail=0;
	for (i=1;i<=n;i++)
		f[i]=false;
	for (i=1;i<=n;i++)
		if (ind[i]==0)
		{
			sum++;
			af[i]=sum;
			tail++;
			queue[tail][1]=i;
			f[i]=true;
		}
	j=1;
	queue[1][2]=0;
	tmp=queue[head][1];
	sum=0;
	while (head<=tail)
    {
		int mini=100000000;
		int u;
		for (i=head;i<=tail;i++)
			if (queue[i][1]<mini)
			{
				mini=queue[i][1];
				u=i;
			}
		swap(head,u);
        tmp=queue[head][1];
		sum++;
		af[queue[head][1]]=sum;
        f[tmp]=true;
        t=a[tmp].next;
		for (i=1;i<=n;i++)
			q[i]=false;
        for (i=1;i<=a[tmp].s;i++)
          {
            ind[e[t].y]--;
            if (ind[e[t].y]==0)
			{
				q[e[t].y]=true;
                tail++;
                queue[tail][1]=e[t].y;
                queue[tail][2]=head;
                f[e[t].y]=true;
              };
            t=e[t].next;
          };
      head++;
    };
	i=0;
	bool t=true;
	for (i=1;i<=n;i++)
	{
		if (ind[i]!=0) t=false;
	}
	if (t)
	{
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
		{
			if (i==af[j])
				fout<<j<<' ';
		}
	}else
	{fout<<"no";}
	fin.close();
	fout.close();
	return 0;
}