记录编号 35688 评测结果 AAAAAAAAAA
题目名称 课程安排问题 最终得分 100
用户昵称 Gravatarfeng 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2012-02-28 18:58:28 内存使用 0.46 MiB
显示代码纯文本
  1. #include<fstream>
  2. #include<algorithm>
  3. using namespace std;
  4. struct node {
  5. int s,next;
  6. };
  7. struct edge {
  8. int y,v,next,f;
  9. };
  10. int i,j,k,n,m,top,tmp,t,head,tail,min,sum=0,p,x,y;
  11. edge e[101];
  12. node a[101];
  13. bool f[101];
  14. bool q[101];
  15. int queue[10000][5];
  16. int ind[101];
  17. int af[101];
  18. void add(int x1,int y1,int v1)
  19. {
  20. m++;
  21. a[x1].s=a[x1].s+1;
  22. e[m].y=y1;
  23. e[m].v=v1;
  24. e[m].next=a[x1].next;
  25. a[x1].next=m;
  26. }
  27. void swap(int x,int y)
  28. {
  29. queue[0][1]=queue[x][1];
  30. queue[x][1]=queue[y][1];
  31. queue[y][1]=queue[0][1];
  32. queue[0][2]=queue[x][2];
  33. queue[x][2]=queue[y][2];
  34. queue[y][2]=queue[0][2];
  35. }
  36. int main()
  37. {
  38. ifstream fin("curriculum.in");
  39. ofstream fout("curriculum.out");
  40. fin>>n;
  41. m=0;
  42. for (i=1;i<=n;i++)
  43. af[i]=0;
  44. for (i=1;i<=n;i++)
  45. {
  46. fin>>k;
  47. for (j=1;j<=k;j++)
  48. {
  49. fin>>y;
  50. x=i;
  51. add(y,x,1);
  52. }
  53. }
  54. for (i=1;i<=m;i++)
  55. {
  56. ind[e[i].y]++;
  57. }
  58. head=1;tail=0;
  59. for (i=1;i<=n;i++)
  60. f[i]=false;
  61. for (i=1;i<=n;i++)
  62. if (ind[i]==0)
  63. {
  64. sum++;
  65. af[i]=sum;
  66. tail++;
  67. queue[tail][1]=i;
  68. f[i]=true;
  69. }
  70. j=1;
  71. queue[1][2]=0;
  72. tmp=queue[head][1];
  73. sum=0;
  74. while (head<=tail)
  75. {
  76. int mini=100000000;
  77. int u;
  78. for (i=head;i<=tail;i++)
  79. if (queue[i][1]<mini)
  80. {
  81. mini=queue[i][1];
  82. u=i;
  83. }
  84. swap(head,u);
  85. tmp=queue[head][1];
  86. sum++;
  87. af[queue[head][1]]=sum;
  88. f[tmp]=true;
  89. t=a[tmp].next;
  90. for (i=1;i<=n;i++)
  91. q[i]=false;
  92. for (i=1;i<=a[tmp].s;i++)
  93. {
  94. ind[e[t].y]--;
  95. if (ind[e[t].y]==0)
  96. {
  97. q[e[t].y]=true;
  98. tail++;
  99. queue[tail][1]=e[t].y;
  100. queue[tail][2]=head;
  101. f[e[t].y]=true;
  102. };
  103. t=e[t].next;
  104. };
  105. head++;
  106. };
  107. i=0;
  108. bool t=true;
  109. for (i=1;i<=n;i++)
  110. {
  111. if (ind[i]!=0) t=false;
  112. }
  113. if (t)
  114. {
  115. for (i=1;i<=n;i++)
  116. for (j=1;j<=n;j++)
  117. {
  118. if (i==af[j])
  119. fout<<j<<' ';
  120. }
  121. }else
  122. {fout<<"no";}
  123. fin.close();
  124. fout.close();
  125. return 0;
  126. }