Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<int> v[50009];
  4. vector<int> vr[50009];
  5. vector<int> comp[50009];
  6. set<int> com[50009];
  7. bool vis[50009];
  8. int parent[50009];
  9. int result[50009];
  10. vector <int> ans;
  11. vector<int> ans2;
  12. int scc = 1;
  13. int n;
  14. void init(){
  15. scc = 1;
  16. ans.clear();
  17. ans2.clear();
  18. memset(vis,0,sizeof vis);
  19. memset(parent,0,sizeof parent);
  20. memset(result,0,sizeof result);
  21. for(int i=0;i<=n;i++){
  22. v[i].clear();
  23. vr[i].clear();
  24. comp[i].clear();
  25. com[i].clear();
  26. }
  27.  
  28. }
  29.  
  30. void dfs(int s){
  31. vis[s] = true;
  32. for(int i=0;i<v[s].size();i++){
  33. if(!vis[v[s][i]]){
  34. dfs(v[s][i]);
  35. }
  36. }
  37. ans.push_back(s);
  38. }
  39. void dfs2(int s){
  40. vis[s] = true;
  41. parent[s] = scc;
  42. com[scc].insert(s);
  43. for(int i=0;i<vr[s].size();i++){
  44. if(!vis[vr[s][i]]){
  45. dfs2(vr[s][i]);
  46. }
  47. }
  48. ans2.push_back(s);
  49. }
  50. int dfs3(int s){
  51. vis[s] = true;
  52. for(int i=0;i<comp[s].size();i++){
  53. if(!vis[comp[s][i]]){
  54. result[s] = result[s] + dfs3(comp[s][i]);
  55. }
  56. else {
  57. result[s] =result[s] + result[comp[s][i]];
  58. }
  59. }
  60. return result[s];
  61. }
  62. int main (){
  63. int test;
  64. int a,b;
  65. scanf("%d",&test);
  66. for(int i=0;i<test;i++){
  67. scanf("%d",&n);
  68. init();
  69. for(int j=0;j<n;j++){
  70. scanf("%d %d",&a,&b);
  71. v[a].push_back(b);
  72. vr[b].push_back(a);
  73. }
  74. for(int j=1;j<=n;j++){
  75. if(!vis[j]){
  76. dfs(j);
  77. }
  78. }
  79. memset(vis,0,sizeof vis);
  80. reverse(ans.begin(),ans.end());
  81. for(int j=0;j<ans.size();j++){
  82. if(!vis[ans[j]]){
  83. dfs2(ans[j]);
  84. scc++;
  85. // for(int k=0;k<ans2.size();k++){
  86. // cout << ans2[k] << " ";
  87. // }
  88. // cout << endl;
  89. // ans2.clear();
  90. }
  91. }
  92. for(int j=1;j<=n;j++){
  93. for(int k=0;k<v[j].size();k++){
  94. if(parent[j]!=parent[v[j][k]]){
  95. comp[parent[j]].push_back(parent[v[j][k]]);
  96. }
  97. }
  98. }
  99. for(int j=1;j<scc;j++){
  100. result[j] = com[j].size();
  101. }
  102. memset(vis,false,sizeof vis);
  103. for(int j=1;j<scc;j++){
  104. if(!vis[j]){
  105. dfs3(j);
  106. }
  107. }
  108. int idx = 1;
  109. int maxx = result[1];
  110. for(int j=1;j<scc;j++){
  111. if(result[j]>maxx){
  112. maxx = result[j];
  113. idx = j;
  114. }
  115. else if(result[j]==maxx){
  116. if(*com[idx].begin()>*com[j].begin()){
  117. idx = j;
  118. }
  119. }
  120. }
  121. printf("Case %d: %d\n",i+1,*com[idx].begin());
  122. }
  123. return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement