#include #include #include using namespace std; const int MAXN = 305; const int MAXM = 100010; struct Edge { int v, next; } shift[MAXN*MAXN*2], edge[MAXN*MAXN*4]; int shiftNumber, edgeNumber; int shiftHead[MAXN*MAXN*2], edgeHead[MAXN*MAXN*2]; int a[MAXN][MAXN], b[MAXN][MAXN]; int al[MAXN*MAXN], bl[MAXN*MAXN]; int ta[MAXN], tb[MAXN]; int na[MAXM], nb[MAXM]; int pa[MAXM][2], pb[MAXM][2]; bool va[MAXM], vb[MAXM]; int n, nn, ca, cb; int differ[MAXN*MAXN], differNumber; int maxNumber; bool inStack[MAXN*MAXN*2]; int dfn[MAXN*MAXN*2], low[MAXN*MAXN*2]; int stack[MAXN*MAXN*2], belong[MAXN*MAXN*2]; int top, index, componentNumber; inline int min(int x, int y) { return x < y ? x : y; } inline int max(int x, int y) { return x > y ? x : y; } inline void swap(int &x, int &y) { int temp = x; x = y; y = temp; } inline int getPosition(int x, int y) { return x * n + y; } inline int getRow(int pos) { return pos / n; } inline int getColumn(int pos) { return pos % n; } void clearEdges() { shiftNumber = 0; edgeNumber = 0; memset(shiftHead, -1, sizeof(shiftHead)); memset(edgeHead, -1, sizeof(edgeHead)); } inline void addShift(int u, int v) { shift[shiftNumber].v = v; shift[shiftNumber].next = shiftHead[u]; shiftHead[u] = shiftNumber ++; } inline void addEdge(int u, int v) { edge[edgeNumber].v = v; edge[edgeNumber].next = edgeHead[u]; edgeHead[u] = edgeNumber ++; } void transpose() { for(int i=0; i cb) { if(isReachableByOneStep()) { ans = cb; } } if(ans > ca + cb) { getDifference(); getNumberPosition(); if(isReachableByTwoStep()) { ans = ca + cb; } else { transpose(); getNumberPosition(); if(isReachableByTwoStep()) { ans = ca + cb; } } } printf("%d\n", ans); } } } return 0; }