STEFAN_STOYANOV

Kotki_ greshno

May 19th, 2022 (edited)
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<string>
  6. #include<vector>
  7. #include<stack>
  8. #include<queue>
  9. #include<deque>
  10. #include<cstdio>
  11. #include<fstream>
  12. #include<map>
  13. #include<set>
  14. using namespace std;
  15. const int maxa=32,inf=(1<<30),maxe=1e7+10,maxn=2048;
  16. struct edge
  17. {
  18.     int to,next,cap;
  19.     edge(){}
  20.     edge(int _to,int _next,int _cap)
  21.     {
  22.         to=_to;
  23.         next=_next;
  24.         cap=_cap;
  25.     }
  26. };
  27. edge e[maxe];int bre;
  28. int n,m,allv,a[maxa][maxa],S,T,F,p;
  29. int lvl[maxn],head[maxn],ptr[maxn],path[maxe],sz;
  30. void read()
  31. {
  32.     cin>>n;
  33.     string s;
  34.     for(int i=1;i<=n;++i)
  35.     {
  36.         cin>>s;
  37.         m=s.size();
  38.         for(int j=0;j<m;++j)
  39.             a[i][j+1]=(int)s[j]-(int)'0';
  40.     }
  41. }
  42. void inline add_edge(int from,int to,int cap)
  43. {
  44.     e[bre]=edge(to,head[from],cap);
  45.     head[from]=bre;bre++;
  46. }
  47. void init_graph()
  48. {
  49.     memset(head,-1,sizeof(head));
  50.     allv=n*m;
  51.     S=0;T=allv+1;
  52.     int cur;
  53.     ///end rows
  54.     for(int i=1;i<=m;++i)
  55.     {
  56.         ///goren red
  57.         cur=i;
  58.         add_edge(cur,cur+allv+1,1);
  59.         add_edge(cur+allv+1,cur,1);
  60.         add_edge(cur+allv+1,T,1);
  61.         add_edge(T,cur+allv+1,0);
  62.         if(a[1][i])
  63.         {
  64.             add_edge(S,cur,1);
  65.             add_edge(cur,S,0);
  66.         }
  67.         ///dolen red
  68.         cur=(n-1)*m+i;
  69.         add_edge(cur,cur+allv+1,1);
  70.         add_edge(cur+allv+1,cur,1);
  71.         add_edge(cur+allv+1,T,1);
  72.         add_edge(T,cur+allv+1,0);
  73.         if(a[n][i])
  74.         {
  75.             add_edge(S,cur,1);
  76.             add_edge(cur,S,0);
  77.         }
  78.     }
  79.     for(int i=1;i<m;++i)
  80.     {
  81.         ///goren red
  82.         cur=i;
  83.         add_edge(cur+allv+1,cur+1,1);add_edge(cur+1,cur+allv+1,0);
  84.         add_edge(cur+1+allv+1,cur,1);add_edge(cur,cur+1+allv+1,0);
  85.         ///dolen red
  86.         cur=(n-1)*m+i;
  87.         add_edge(cur+allv+1,cur+1,1);add_edge(cur+1,cur+allv+1,0);
  88.         add_edge(cur+1+allv+1,cur,1);add_edge(cur,cur+1+allv+1,0);
  89.     }
  90.     ///end colums
  91.     for(int i=2;i<n;++i)
  92.     {
  93.         ///lqva kolona
  94.         cur=(i-1)*m+1;
  95.         add_edge(cur,cur+allv+1,1);
  96.         add_edge(cur+allv+1,cur,1);
  97.         add_edge(cur+allv+1,T,1);
  98.         add_edge(T,cur+allv+1,0);
  99.         if(a[i][1])
  100.         {
  101.             add_edge(S,cur,1);
  102.             add_edge(cur,S,0);
  103.         }
  104.         ///dqsna kolona
  105.         cur=(i-1)*m+m;
  106.         add_edge(cur,cur+allv+1,1);
  107.         add_edge(cur+allv+1,cur,1);
  108.         add_edge(cur+allv+1,T,1);
  109.         add_edge(T,cur+allv+1,0);
  110.         if(a[i][1])
  111.         {
  112.             add_edge(S,cur,1);
  113.             add_edge(cur,S,0);
  114.         }
  115.     }
  116.     for(int i=1;i<n;++i)
  117.     {
  118.         ///lqva kolona
  119.         cur=(i-1)*m+1;
  120.         add_edge(cur+allv+1,cur+m,1);add_edge(cur+m,cur+allv+1,0);
  121.         add_edge(cur+m+allv+1,cur,1);add_edge(cur,cur+m+allv+1,0);
  122.         ///dqsna kolona
  123.         cur=(i-1)*m+m;
  124.         add_edge(cur+allv+1,cur+m,1);add_edge(cur+m,cur+allv+1,0);
  125.         add_edge(cur+m+allv+1,cur,1);add_edge(cur,cur+m+allv+1,0);
  126.     }
  127.     ///central
  128.     for(int i=2;i<n;++i)
  129.     {
  130.         for(int j=2;j<m;++j)
  131.         {
  132.             cur=(i-1)*m+j;
  133.             add_edge(cur,cur+allv+1,1);
  134.             add_edge(cur+allv+1,cur,1);
  135.             if(a[i][j])
  136.             {
  137.                 add_edge(S,cur,1);
  138.                 add_edge(cur,S,0);
  139.             }
  140.             add_edge(cur+allv+1,cur-m,1);add_edge(cur-m,cur+allv+1,0);
  141.             add_edge(cur-m+allv+1,cur,1);add_edge(cur,cur-m+allv+1,0);
  142.             add_edge(cur+allv+1,cur-1,1);add_edge(cur-1,cur+allv+1,0);
  143.             add_edge(cur-1+allv+1,cur,1);add_edge(cur,cur-1+allv+1,0);
  144.         }
  145.     }
  146.     for(int i=2;i<m;++i)
  147.     {
  148.         cur=(n-1)*m+i;
  149.         ///nqma nuzhda ot dublirane i checkvane za iztochnik
  150.         add_edge(cur+allv+1,cur-m,1);add_edge(cur-m,cur+allv+1,0);
  151.         add_edge(cur-m+allv+1,cur,1);add_edge(cur,cur-m+allv+1,0);
  152.     }
  153.     for(int i=2;i<n;++i)
  154.     {
  155.         cur=(i-1)*m+m;
  156.         ///nqma nuzhda ot dublirane i checkvane za iztochnik
  157.         add_edge(cur+allv+1,cur-1,1);add_edge(cur-1,cur+allv+1,0);
  158.         add_edge(cur-1+allv+1,cur,1);add_edge(cur,cur-1+allv+1,0);
  159.     }
  160. }
  161. bool BFS()
  162. {
  163.     //cout<<"In BFS\n";
  164.     memset(lvl,0,sizeof(lvl));
  165.     lvl[T]=1;
  166.     queue<int>q;
  167.     q.push(T);
  168.     int w,nb,i;
  169.     while(!q.empty())
  170.     {
  171.         w=q.front();
  172.         q.pop();
  173.         //cout<<"In while BFS\n";
  174.         for(i=head[w]/*,cout<<"in for BFS\n"*/;i!=-1;i=e[i].next)
  175.             if(!lvl[e[i].to]&&e[i^1].cap>0)
  176.             {
  177.                 //cout<<"in if for BFS\n";
  178.                 lvl[e[i].to]=lvl[w]+1;
  179.                 //cout<<lvl[e[i].to]<<' '<<e[i].to<<' '<<w<<endl;
  180.                 q.push(e[i].to);
  181.             }
  182.     }
  183.     //cout<<"Exit BFS\n";
  184.     return lvl[S];
  185. }
  186. bool DFS(int ver)
  187. {
  188.     if(ver==T)return true;
  189.     for(int i=ptr[ver];i!=-1;i=ptr[ver]=e[i].next)
  190.     {
  191.         if(lvl[e[i].to]+1==lvl[ver]&&e[i].cap>0)
  192.         {
  193.             if(DFS(e[i].to))
  194.             {
  195.                 if(e[i].cap<p)p=e[i].cap;
  196.                 path[sz]=i;
  197.                 sz++;
  198.                 return true;
  199.             }
  200.         }
  201.     }
  202.     return false;
  203. }
  204. void update()
  205. {
  206.     int x;
  207.     for(int i=0;i<sz;++i)
  208.     {
  209.         x=path[i];
  210.         e[x].cap-=p;
  211.         e[x^1].cap+=p;
  212.     }
  213. }
  214. void Dinitz()
  215. {
  216.     while(BFS())
  217.     {
  218.         /*for(int i=1;i<=2*n*m+1;i++)
  219.             cout<<lvl[i]<<' ';*/
  220.         cout<<"Passed BFS\n";
  221.         for(int i=0;i<=2*n*m+1;i++)
  222.             ptr[i]=head[i];
  223.         sz=0;
  224.         p=inf;
  225.         while(DFS(S))
  226.         {
  227.             F+=p;
  228.             cout<<p<<' '<<F<<endl;
  229.             update();
  230.             p=inf;
  231.             sz=0;
  232.         }
  233.         //cout<<endl;
  234.     }
  235.     cout<<F<<endl;
  236. }
  237. int main()
  238. {
  239.     /*ios_base::sync_with_stdio(false);
  240.     cin.tie(NULL);
  241.     cout.tie(NULL);*/
  242.     read();
  243.     /*cout<<endl;
  244.     for(int i=1;i<=n;++i,cout<<endl)
  245.         for(int j=1;j<=m;++j)
  246.         cout<<a[i][j]<<' ';*/
  247.     init_graph();
  248.     cout<<"Initializated graph\n";
  249.     for(int i=0;i<=2*n*m+1;i++)
  250.     {
  251.         cout<<"i=="<<i<<endl;
  252.         for(int j=head[i];j!=-1;j=e[j].next)
  253.             cout<<e[j].to<<' '<<e[j].cap<<endl;
  254.         cout<<endl;
  255.     }
  256.     cout<<endl;
  257.     Dinitz();
  258. return 0;
  259. }
  260. /*
  261. 3
  262. 0001
  263. 0110
  264. 1001
  265. */
  266. /*
  267. 3
  268. 110
  269. 010
  270. 001
  271. */
  272. /*
  273. 5
  274. 111010
  275. 000101
  276. 111101
  277. 111001
  278. 001000
  279. */
  280.  
Add Comment
Please, Sign In to add comment