Guest User

Untitled

a guest
Jun 25th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<vector>
  4. #include<set>
  5. using namespace std;
  6.  
  7. #define maxm 40100
  8.  
  9. int l[maxm],r[maxm],col[maxm],pre[maxm],n,m;
  10. vector<int>v[maxm],vt[maxm],topo,v1[maxm],v2;
  11. set<int>ss[maxm];
  12. void dfs(int s);
  13. void dfst(int s,int par);
  14. bool dfss(int s);
  15. int match();
  16.  
  17. int main(){
  18.  
  19. int i,j,k,l,test,t=1;
  20.  
  21. // freopen("in.txt","r",stdin);
  22.  
  23. scanf("%d",&test);
  24.  
  25. while(test--){
  26.  
  27. scanf("%d %d",&n,&m);
  28.  
  29. for(i=0;i<=n;i++){
  30. v[i].clear();
  31. vt[i].clear();
  32. v1[i].clear();
  33. pre[i]=i;
  34. // ss[i].clear();
  35. }
  36. topo.clear(); v2.clear();
  37.  
  38. for(i=1;i<=m;i++){
  39. scanf("%d %d",&k,&l);
  40. v[k].push_back(l);
  41. vt[l].push_back(k);
  42. }
  43.  
  44. memset(col,0,sizeof(col));
  45.  
  46. for(i=1;i<=n;i++){
  47. if(!col[i]) dfs(i);
  48. }
  49.  
  50. for(j=topo.size()-1;j>=0;j--){
  51. i=topo[j];
  52. if(col[i]){
  53. v2.push_back(i);
  54. dfst(i,i);
  55. }
  56. }
  57.  
  58. for(i=1;i<=n;i++){
  59. k=pre[i];
  60. for(j=0;j<v[i].size();j++){
  61. l=pre[v[i][j]];
  62. if(k==l) continue;
  63. // if(ss[k].find(l)!=ss[k].end()) continue;
  64. // ss[k].insert(l);
  65. v1[k].push_back(l+n);
  66. }
  67. }
  68. printf("Case %d: %d\n",t++,match());
  69.  
  70.  
  71.  
  72. }
  73.  
  74. return 0;
  75. }
  76.  
  77. int match() {
  78. int ret = 0;
  79.  
  80. memset(r,-1,sizeof(r));
  81. memset(l,-1,sizeof(l));
  82.  
  83. int i,j,k;
  84. bool done;
  85. do{
  86. done = 1;
  87. memset(col,0,sizeof(col));
  88.  
  89. for(j=0;j<v2.size();j++)
  90. {
  91. i=v2[j];
  92. if(l[i]==-1 && dfss(i)) done = 0;
  93. }
  94.  
  95. }while(!done);
  96.  
  97. for(j=0;j<v2.size();j++){
  98. i=v2[j];
  99. ret += (r[i+n]==-1);
  100. }
  101. return ret;
  102. }
  103.  
  104. bool dfss(int u) {
  105.  
  106. if(col[u]) return false;
  107. col[u] = true;
  108. int v,i,j,k;
  109. for(i=0;i<v1[u].size();i++)
  110. {
  111. v = v1[u][i];
  112. if(r[v]==-1)
  113. {
  114. r[v] = u, l[u] = v;
  115. return true;
  116. }
  117. }
  118. for(i=0;i<v1[u].size();i++)
  119. {
  120. v = v1[u][i];
  121. if(dfss(r[v]))
  122. {r[v] = u, l[u] = v;
  123. return true;
  124. }
  125. }
  126. return false;
  127. }
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134. void dfs(int s){
  135.  
  136. col[s]=1;
  137.  
  138. int i,j,k,l;
  139.  
  140. for(i=0;i<v[s].size();i++){
  141. k=v[s][i];
  142. if(!col[k]){
  143. dfs(k);
  144. }
  145. }
  146. topo.push_back(s);
  147. }
  148. void dfst(int s,int par){
  149.  
  150. pre[s]=par;
  151.  
  152. col[s]=0;
  153. int i,j,k;
  154.  
  155. for(i=0;i<vt[s].size();i++){
  156. k=vt[s][i];
  157. if(col[k]){
  158. dfst(k,par);
  159. }
  160. }
  161. }
Add Comment
Please, Sign In to add comment