advertisement

Computer Science Club The best thing about a boolean is even if you are wrong, you are only off by a bit. USACO • It’s over! • You can find analysis and test data at ace.delos.com/OCT10B.htm (or 10S, 10G) • If you “missed” it, go take it next weekend • Nov.5-8 • You can still qualify for the next division by getting ~85% • Note that Gold #1 was almost the same as the problem of the week… (the knapsack one) USACO Silver #2 • Count the number of lakes • Recursive flood-fill (also known as dfs or depth first search) • Begin the recursion at each unvisited point • Mark points visited as you visit them • At each step, continue the recursion to each unvisited neighbor • Each time you restart the recursion, you have found a new lake W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W. Code for Flood Fill int countlakes() { int groupc=0; for(int x=0;x<numX;x++) for(int y=0;y<numY;y++) if(!vis[x][y]) // not visited yet { dfs(x,y); // start recursion groupc++; // increment count } return groupc; } Code for Flood Fill (cont.) int[] mx={-1,-1,-1,0,0,1,1,1}; // movement arrays int[] my={-1,0,1,-1,1,-1,0,1}; // save a lot of typing! void dfs(int x,int y) { if(x<0 || x>=numX || y<0 || y>=numY || vis[x][y]) return; // out of bounds or already visited vis[x][y]=true; // mark as visited for(int m=0;m<8;m++) // go through movement array dfs(x+mx[m],y+my[m]); // recurse } Dijkstra’s Algorithm Used to find the shortest path between a starting position and destination. Given a graph with specified distances of the directional paths between nodes: Task: Find the shortest path from Node a (initial node) to Node f (destination). For example, A-C-D-F has a distance of 3 + 10 + 2 = 15. The path A-C-E-F has a distance of 3 + 3 + 5 = 11. Is there a path even SHORTER than that? Can you be sure your path is the shortest possible? Dijkstra’s cont… The Steps Step 1: Each node has a distance value. (a = 0, others = ∞) 3 Step 2: Two node sets: visited and unvisited (init: none visited) Step 3: a = curNode Step 4: (recursive step!) - Update unvisited neighbors of curNode with new shortest dist - move curNode to visited set - new curNode = smallest unvisited node 2 Dijkstra’s cont…Finishing Up When curNode = destination, shortest path = value of final node. Try to trace the algorithm and find the shortest path and minimal distance. Consider… Why don’t we need to recheck visited nodes? Why can’t there be a shorter path to a visited node? 3 2 REMEMBER… The first real USACO round will be this weekend! Practice with the free USACO Training lessons: http://ace.delos.com/usacogate Sign in! Have fun coding