#include using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair ii; typedef vector vi; typedef vector< ii > vii; #define INF 0x3F3F3F3F #define LINF 0x3F3F3F3F3F3F3F3FLL #define pb push_back #define mp make_pair #define pq priority_queue #define LSONE(s) ((s)&(-s)) //LASTBIT #define DEG_to_RAD(X) (X * PI / 180) #define F first #define S second #ifdef ONLINE_JUDGE #define debug(args...) #else #define debug(args...) fprintf(stderr,args) #endif ////////////////////// int dx[] = {1,-1,0,0}; int dy[] = {0,0,-1,1}; ////////////////////// const int N = 10011; const int M = 18; int n,k; int a[N],b[N]; vi g[N]; int lca[M][N]; int depth[N]; void dfs( int x = 1, int ult = 0, int prof = 0 ) { depth[x] = prof; lca[0][x] = ult; for(int i=0;i<(int)g[x].size();++i) { int y = g[x][i]; if( y == ult ) continue; dfs(y,x,prof+1); } } void process() { for(int i=1;i=0;--i) if( lca[i][a] != lca[i][b] ) a = lca[i][a], b = lca[i][b]; return lca[0][a]; } int get_dist( int a, int b ) { if( a == b ) return 0; if( depth[a] < depth[b] ) swap(a,b); int l = get_anc(a,b); return depth[a]+depth[b]-2*depth[l]; } int cost[310][310]; int flow[610][610]; int p[610], vis[610]; vi graph[610]; int s,t; bool bfs() { memset(vis,0,sizeof vis); memset(p,-1,sizeof p); queueq; q.push(s); vis[s] = 1; while(!q.empty()) { int x = q.front(); q.pop(); for(int i=0;i