fork(1) download
  1. //Lib
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<ctime>
  7.  
  8. #include<iostream>
  9. #include<algorithm>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. #include<stack>
  14. #include<set>
  15. #include<map>
  16. using namespace std;
  17. //Macro
  18. #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
  19. #define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
  20. #define erep(i,e,x) for(int i=x;i;i=e[i].next)
  21. #define irep(i,x) for(__typeof(x.begin()) i=x.begin();i!=x.end();i++)
  22. #define read() (strtol(ipos,&ipos,10))
  23. #define sqr(x) ((x)*(x))
  24. #define pb push_back
  25. #define PS system("pause");
  26. typedef long long ll;
  27. typedef pair<int,int> pii;
  28. const int oo=~0U>>1;
  29. const double inf=1e100;
  30. const double eps=1e-6;
  31. string name="", in=".in", out=".out";
  32. //Var
  33. struct E
  34. {
  35. int node,next,cap;
  36. }e[50000];
  37. queue<int> q;
  38. int boy[60][3],girl[60][3];
  39. int n,k,cnt,tot=1,flow,st,ed;
  40. int dis[1000],h[1000];
  41. void add(int a,int b,int c)
  42. {
  43. e[++tot].next=h[a];e[tot].node=b;e[tot].cap=c;h[a]=tot;
  44. e[++tot].next=h[b];e[tot].node=a;e[tot].cap=0;h[b]=tot;
  45. }
  46. void Init()
  47. {
  48. char s;
  49. scanf("%d%d\n",&n,&k);
  50. rep(i,1,n)rep(j,0,2)boy[i][j]=++cnt;
  51. rep(i,1,n)rep(j,0,2)girl[i][j]=++cnt;
  52. st=++cnt;ed=++cnt;
  53. rep(i,1,n)
  54. {
  55. add(st,boy[i][0],0);
  56. add(boy[i][0],boy[i][1],oo);
  57. add(boy[i][0],boy[i][2],k);
  58. add(girl[i][0],ed,0);
  59. add(girl[i][1],girl[i][0],oo);
  60. add(girl[i][2],girl[i][0],k);
  61. }
  62. rep(i,1,n)rep(j,1,n)
  63. {
  64. cin>>s;
  65. if(s=='Y')add(boy[i][1],girl[j][1],1);
  66. else add(boy[i][2],girl[j][2],1);
  67. }
  68. }
  69. bool BFS()
  70. {
  71. int u,v;bool flag=false;
  72. memset(dis,-1,sizeof dis);
  73. q.push(ed);dis[ed]=0;
  74. while(!q.empty())
  75. {
  76. u=q.front();q.pop();
  77. erep(i,e,h[u])
  78. {
  79. if(dis[v=e[i].node]!=-1||!e[i^1].cap)continue;
  80. q.push(v);
  81. dis[v]=dis[u]+1;
  82. if(v==st)flag=true;
  83. }
  84. }
  85. return flag;
  86. }
  87. int DFS(int u,int low)
  88. {
  89. if(u==ed)return low;
  90. int v,tmp,ret=low;
  91. erep(i,e,h[u])
  92. {
  93. if(dis[v=e[i].node]!=dis[u]-1||!e[i].cap)continue;
  94. tmp=DFS(v,min(low,e[i].cap));
  95. e[i].cap-=tmp;
  96. e[i^1].cap+=tmp;
  97. low-=tmp;
  98. if(low==0)break;
  99. }
  100. if(low==ret)dis[u]=-1;
  101. return ret-low;
  102. }
  103. int Dinic()
  104. {
  105. int flow,ret=0;
  106. while(BFS())
  107. while(flow=DFS(st,oo))
  108. ret+=flow;
  109. return ret;
  110. }
  111. int Work()
  112. {
  113. rep(T,1,n)
  114. {
  115. erep(i,e,h[st])e[i].cap++;
  116. erep(i,e,h[ed])e[i^1].cap++;
  117. flow+=Dinic();
  118. if(flow!=T*n)return T-1;
  119. }
  120. return n;
  121. }
  122. int main()
  123. {
  124. // freopen((name+in).c_str(),"r",stdin);
  125. // freopen((name+out).c_str(),"w",stdout);
  126. Init();
  127. cout<<Work()<<endl;
  128. return 0;
  129. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty