Advertisement
Manioc

1490

Oct 15th, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 100007
  3.  
  4. using namespace std;
  5.  
  6. struct edge{
  7.     int to, cap, rev;
  8.  
  9.     edge(int _to, int _cap, int _rev): to(_to), cap(_cap), rev(_rev){}
  10. };
  11.  
  12. struct dinic{
  13.     int INF;
  14.     vector<edge> graph[MAX];
  15.     int level[MAX], iter[MAX];
  16.  
  17.     dinic(){
  18.         INF = 1e9 + 7;
  19.         fill(level, level+MAX, 0);
  20.         fill(iter, iter+MAX, 0);
  21.         fill(graph, graph+MAX, vector<edge> ());
  22.     }
  23.  
  24.     void add(int from, int to, int cap){
  25.         graph[from].push_back(edge(to, cap, graph[to].size()));
  26.         graph[to].push_back(edge(from, 0, graph[from].size()-1));
  27.     }
  28.  
  29.     void bfs(int s){
  30.         memset(level, -1, sizeof level);
  31.         queue<int> q;
  32.         level[s] = 0;
  33.         q.push(s);
  34.  
  35.         while(!q.empty()){
  36.             int actual = q.front();
  37.             q.pop();
  38.  
  39.             for(int i = 0; i < graph[actual].size(); i++){
  40.                 edge &e = graph[actual][i];
  41.                 if(e.cap > 0 && level[e.to] < 0){
  42.                     level[e.to] = level[actual] + 1;
  43.                     q.push(e.to);
  44.                 }
  45.             }
  46.         }
  47.     }
  48.  
  49.     int dfs(int v, int t, int f){
  50.         if(v == t) return f;
  51.  
  52.         for(int &i = iter[v]; i < graph[v].size(); i++){
  53.             edge &e = graph[v][i];
  54.             if(e.cap > 0 && level[v] < level[e.to]){
  55.                 int d = dfs(e.to, t, min(f, e.cap));
  56.                 if(d > 0){
  57.                     e.cap -= d;
  58.                     graph[e.to][e.rev].cap += d;
  59.                     return d;
  60.                 }
  61.             }
  62.         }
  63.         return 0;
  64.     }
  65.  
  66.     int flow(int start, int to){
  67.         int ans = 0;
  68.         while(true){
  69.             bfs(start);
  70.             if(level[to] < 0) return ans;
  71.             memset(iter, 0, sizeof iter);
  72.             int f;
  73.             while((f = dfs(start, to, INF)) > 0) ans += f;
  74.            
  75.         }
  76.     }
  77. };
  78.  
  79. int linha[2][MAX], coluna[2][MAX];
  80. int main(){
  81.     int n;
  82.     while(scanf("%d", &n) != EOF){
  83.         int no = 2;
  84.         memset(linha, 0, sizeof linha);
  85.         memset(coluna, 0, sizeof coluna);
  86.         for(int i = 0; i < n; i++) {
  87.             linha[0][i] = no++;
  88.             coluna[0][i] = no++;
  89.         }
  90.  
  91.         dinic d = dinic();
  92.         for(int i = 0; i < n; i++){
  93.             for(int j = 0; j < n; j++){
  94.                 char pos; scanf(" %c", &pos);
  95.                 if(pos == 'X'){
  96.                     if(linha[1][i]) linha[0][i] = no++;
  97.                     if(coluna[1][j]) coluna[0][j] = no++;
  98.                 }else{
  99.                     linha[1][i] = 1;
  100.                     coluna[1][j] = 1;
  101.                     d.add(linha[0][i], coluna[0][j], 1);
  102.                 }
  103.             }
  104.         }
  105.  
  106.         for(int i = 2; i < no; i++){
  107.             if(i%2 == 0) d.add(0, i, 1);
  108.             else d.add(i, 1, 1);
  109.         }
  110.  
  111.         printf("%d\n", d.flow(0,1));
  112.     }
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement