#include using namespace std; const int MAX = 25; char grid[MAX*MAX]; struct baseadj{ int nadj; int adj[5]; } base[MAX*MAX]; class edge { public: int w; edge *next; edge(int vert = -1, edge *nxt = 0) { w = vert; next = nxt; } }; edge gr[MAX*MAX*(MAX*((MAX+1)/2)+MAX) + 2] = {0}; int path[MAX*MAX*(MAX*((MAX+1)/2)+MAX)] = {0}; int npath; int sink; int shortest(int n) { int path[n][n]; bool 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 (inext) { if (!visited[p->w]) { visited[p->w] = true; path[len+1] = p->w; if (findPath(len+1, visited, maxlen)) return true; } } return false; } bool findPath(int level) { bool visited[sink+1]; for(int i=0; i<=sink; i++) visited[i] = false; return findPath(0, visited, 3*level); } bool deleteEdge(int v, int w) { edge *p = gr+v; while (p->next != 0 && p->next->w != w) p = p->next; if (p->next == 0) return false; edge* tmp = p->next; p->next = tmp->next; delete tmp; return true; } int flow = 0; int maxflow(int level) { while (findPath(level)) { flow++; for(int i=0; i> n; while (n != 0) { icase++; for(int i=0; i> grid[n*j+i]; for(int i=0; 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; iw == sink) { delete gr[sink-i].next; gr[sink-i].next = 0; } } gr[sink].next = 0; index = sink-n*n-1; sink += n*n; for(int j=0; jw == sink-n*n) gr[index].next = 0; for(int k=0; knext) { int w = p->w; p->w += n*n; int v = p->w; deleteEdge(v, sink); deleteEdge(w, v); gr[v].next = new edge(w, gr[v].next); } } cout << "Case " << icase << ": " << minlen << endl; cin >> n; } }