#include #include #include using namespace std; struct node { int v , f; node *next , *rev; } pool[142000] , *g[12000]; int top; int n , m , k; int s , t; int x[12] , y[12] , u[12]; int level[12000]; void clear () { int i; for ( i = 1 ; i <= top ; i++ ) { pool[i] = pool[0]; } for ( i = 1 ; i <= t ; i++ ) { g[i] = NULL; } top = 0; } void add ( int u , int v , int f ) { node *tmp1 = &pool[++top] , *tmp2 = &pool[++top]; tmp1 -> v = v; tmp1 -> f = f; tmp1 -> next = g[u]; g[u] = tmp1; tmp1 -> rev = tmp2; tmp2 -> v = u; tmp2 -> f = 0; tmp2 -> next = g[v]; g[v] = tmp2; tmp2 -> rev = tmp1; } bool makelevel () { int i , k; queue < int > q; for ( i = 1 ; i <= t ; i++ ) level[i] = -1; level[s] = 1; q.push ( s ); while ( q.size () != 0 ) { k = q.front (); q.pop (); for ( node *j = g[k] ; j ; j = j -> next ) if ( j -> f && level[j->v] == -1 ) { level[j->v] = level[k] + 1; q.push ( j -> v ); if ( j -> v == t ) return true; } } return false; } int find ( int k , int key ) { if ( k == t ) return key; int i , s = 0; for ( node *j = g[k] ; j ; j = j -> next ) if ( j -> f && level[j->v] == level[k] + 1 && s < key ) { i = find ( j -> v , min ( key - s , j -> f ) ); j -> f -= i; j -> rev -> f += i; s += i; } if ( s == 0 ) level[k] = -1; return s; } int dinic () { int ans = 0; while ( makelevel () == true ) ans += find ( s , 9999999 ); //printf ( "%d\n" , ans ); return ans; } int check ( int dis ) { int i , j , l , now , cnt[120]; clear (); for ( i = 1 ; i <= k ; i++ ) { add ( 1 , 1 + i , u[i] ); } for ( i = 0 ; i < (1<= 2050 ) ans = -1; printf ( "%d\n" , ans ); } int main () { int t; scanf ( "%d" , &t ); while ( t-- ) work (); return 0; }