Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 100007
- using namespace std;
- struct edge{
- int to, cap, rev;
- edge(int _to, int _cap, int _rev): to(_to), cap(_cap), rev(_rev){}
- };
- struct dinic{
- int INF;
- vector<edge> graph[MAX];
- int level[MAX], iter[MAX];
- dinic(){
- INF = 1e9 + 7;
- fill(level, level+MAX, 0);
- fill(iter, iter+MAX, 0);
- fill(graph, graph+MAX, vector<edge> ());
- }
- void add(int from, int to, int cap){
- graph[from].push_back(edge(to, cap, graph[to].size()));
- graph[to].push_back(edge(from, 0, graph[from].size()-1));
- }
- void bfs(int s){
- memset(level, -1, sizeof level);
- queue<int> q;
- level[s] = 0;
- q.push(s);
- while(!q.empty()){
- int actual = q.front();
- q.pop();
- for(int i = 0; i < graph[actual].size(); i++){
- edge &e = graph[actual][i];
- if(e.cap > 0 && level[e.to] < 0){
- level[e.to] = level[actual] + 1;
- q.push(e.to);
- }
- }
- }
- }
- int dfs(int v, int t, int f){
- if(v == t) return f;
- for(int &i = iter[v]; i < graph[v].size(); i++){
- edge &e = graph[v][i];
- if(e.cap > 0 && level[v] < level[e.to]){
- int d = dfs(e.to, t, min(f, e.cap));
- if(d > 0){
- e.cap -= d;
- graph[e.to][e.rev].cap += d;
- return d;
- }
- }
- }
- return 0;
- }
- int flow(int start, int to){
- int ans = 0;
- while(true){
- bfs(start);
- if(level[to] < 0) return ans;
- memset(iter, 0, sizeof iter);
- int f;
- while((f = dfs(start, to, INF)) > 0) ans += f;
- }
- }
- };
- int linha[2][MAX], coluna[2][MAX];
- int main(){
- int n;
- while(scanf("%d", &n) != EOF){
- int no = 2;
- memset(linha, 0, sizeof linha);
- memset(coluna, 0, sizeof coluna);
- for(int i = 0; i < n; i++) {
- linha[0][i] = no++;
- coluna[0][i] = no++;
- }
- dinic d = dinic();
- for(int i = 0; i < n; i++){
- for(int j = 0; j < n; j++){
- char pos; scanf(" %c", &pos);
- if(pos == 'X'){
- if(linha[1][i]) linha[0][i] = no++;
- if(coluna[1][j]) coluna[0][j] = no++;
- }else{
- linha[1][i] = 1;
- coluna[1][j] = 1;
- d.add(linha[0][i], coluna[0][j], 1);
- }
- }
- }
- for(int i = 2; i < no; i++){
- if(i%2 == 0) d.add(0, i, 1);
- else d.add(i, 1, 1);
- }
- printf("%d\n", d.flow(0,1));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement