import java.util.*; public class E { public static final int MAX = 25; public static char [] grid = new char[MAX*MAX]; public static baseadj [] base = new baseadj[MAX*MAX]; public static edge [] gr = new edge[MAX*MAX*(MAX*((MAX+1)/2)+MAX) + 2]; public static int [] path = new int[MAX*MAX*(MAX*((MAX+1)/2)+MAX)]; public static int npath; public static int sink; public static boolean printpath = false; public static int flow = 0; public static int shortest(int n) { int [][] path = new int[n][n]; boolean done = false; for(int i=0; i0 && path[i-1][j] + 1 < ans) ans = path[i-1][j]+1; if (i0 && path[i-1][n-1] + 1 < ans) return path[i-1][n-1]+1; if (i0 && grid[i-n] == '.') base[i].adj[base[i].nadj++] = n*n-n; base[i].adj[base[i].nadj++] = n*n; if (r>0 && grid[i-1] == '.') base[i].adj[base[i].nadj++] = n*n-1; if (r=1; i--) { // source vertex gr[0].next = new edge(i, gr[0].next); } int index = 0; sink = n*n*(minlen+1) + 1; for(int i=0; i=1; i--) { // source vertex gr[0].next = new edge(i, gr[0].next); } index = 0; sink = n*n*(minlen+1) + 1; for(int i=0; i