/* March of the penguins Mathijs Vogelzang, April 2007 Total +- 30 minutes. Can be improved by using Dijkstra to augment paths. Extra 15 minutes to find & fix stupidness in flow implementation. */ #include #include #include #include #include using namespace std; typedef vector VI; #define MAXN 100 struct Island { int penguins; int maxjump; int X, Y; }; double jump; int totalPenguins; vector islands; int N; int dest; int flows[MAXN][MAXN], iflows[MAXN]; bool canjump[MAXN][MAXN]; bool visit[MAXN*2]; int augmentFlow(int src) { if(src == dest) return 1; visit[src] = 1; if(src < N) { // entry of island if(!visit[src+N] && iflows[src] < islands[src].maxjump && augmentFlow(src+N)) { iflows[src] ++; return 1; } for(int i=0;i 0 && augmentFlow(i+N)) { flows[i][src]--; return 1; } } else { // exit of island src -= N; if(!visit[src] && iflows[src] > 0 && augmentFlow(src)) { iflows[src] --; return 1; } for(int i=0;i 0) break; } return n == totalPenguins; } void initJumps() { double d2 = jump * jump; for(int i=0;i 1E-9); canjump[i][j] = canjump[j][i] = distance < d2; } } int main() { int runs; scanf("%d", &runs); while(runs--) { scanf("%d %lf", &N, &jump); islands = vector(N); totalPenguins = 0; for(int i=0;i poss; initJumps(); for(int i=0;i