【数据结构】SJTU OJ 1237

前端之家收集整理的这篇文章主要介绍了【数据结构】SJTU OJ 1237前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://acm.sjtu.edu.cn/OnlineJudge/problem/1237

烦死了烦死了

应该按照年份考虑的,自己做的时候又忘记减入度,真是活该。快复习!!

  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int begin=1,tail=0,Q[100001]={0},cnt=0,tmp=0,res=0,de;
  5. int begin_=1,tail_=0,Q_[100001]={0};
  6. void enQueue_(int x)
  7. {
  8. ++tail_;
  9. Q_[tail_]=x;
  10. }
  11. int result[101];
  12. void enQueue(int x)
  13. {
  14. ++tail;
  15. Q[tail]=x;
  16. }
  17. class graph
  18. {
  19. private:
  20. int vSize,eSize;
  21. struct edgeNode{
  22. int weight;
  23. int end;
  24. edgeNode*next;
  25. edgeNode(int e,int w,edgeNode *n=NULL)
  26. {
  27. weight=w;
  28. end = e;
  29. next=n;
  30. }
  31. };
  32. struct verNode{
  33. int ver;
  34. edgeNode*head;
  35. verNode(edgeNode*h=NULL)
  36. {
  37. head = h;
  38. }
  39. };
  40. verNode*verList;
  41. public:
  42. graph(int size)
  43. {
  44. vSize =size;
  45. eSize =0;
  46. verList = new verNode[vSize+1];
  47. for(int i=1;i<=vSize;++i)
  48. {
  49. verList[i].ver =i;
  50. }
  51. }
  52. void insert(int u,int v,int weight=1)
  53. {
  54. verList[u].head = new edgeNode(v,weight,verList[u].head);
  55. eSize++;
  56. }
  57. int topSort()
  58. {
  59. int *inDegrees=new int[vSize+1];
  60. for(int i=1;i<=vSize;++i)
  61. inDegrees[i]=0;
  62. for(int i=1;i<=vSize;++i)
  63. {
  64. edgeNode*p=verList[i].head;
  65. while(p!=NULL)
  66. {
  67. ++inDegrees[p->end];
  68. p=p->next;
  69. }
  70. }
  71. bool *marked=new bool[vSize+1];for(int j=1;j<=vSize;++j) marked[j]=false;
  72. for(int i=1;i<=vSize;++i)
  73. {
  74. if(inDegrees[i]==0)
  75. {
  76. enQueue(i);
  77. }
  78. }
  79.  
  80. while(begin<=tail)
  81. {
  82. if(begin<=tail)++tmp;
  83. while(begin<=tail)
  84. {
  85. de =Q[begin];begin++;
  86. marked[de]=true;
  87. edgeNode*p=verList[de].head;
  88. while(p!=NULL){
  89. if(marked[p->end]==false)
  90. {
  91. if(--inDegrees[p->end]==0)enQueue_(p->end);
  92. }
  93. p=p->next;
  94. }
  95. }
  96. if(begin_<=tail_) tmp++;
  97. while(begin_<=tail_)
  98. {
  99. de = Q_[begin_];begin_++;
  100. marked[de]=true;
  101. edgeNode*p=verList[de].head;
  102. while(p!=NULL){
  103. if(marked[p->end]==false)
  104. {
  105. if(--inDegrees[p->end]==0) enQueue(p->end);
  106. // marked[p->end]=true;
  107. }
  108. p=p->next;
  109. }
  110. }
  111. }
  112. return tmp;
  113. }
  114. };
  115. int main()
  116. {
  117. int n,m,u,v;
  118. cin>>n>>m;
  119. graph g(n);
  120. for(int i=0;i<m;++i)
  121. {
  122. cin>>u>>v;
  123. g.insert(u,v);
  124. }
  125. g.topSort();
  126. cout<<tmp;
  127. return 0;
  128. }



猜你在找的数据结构相关文章