#include #include #include #include #include #include #include #define maxn 100010 using namespace std; int n,m; vector neigh[maxn]; map, int> edge_ids; int p_cyc[maxn]; int p_path[maxn]; int get_id(int x, int y){ if (yb)swap(a,b); edge_ids[make_pair(a,b)]=i; } memset(p_cyc, -1, sizeof(p_cyc)); memset(p_path, -1, sizeof(p_path)); dfs_cyc(1, -1); if(p_cyc[1]==-1){ // 1 is not part of a cycle printf("No solution\n"); return 0; } dfs_path(1); vector nodes_in_path; vector nodes_in_cycle; set cyc_set; // make path a vector int node = 0; while(node != 1){ nodes_in_path.push_back(node); node=p_path[node]; } nodes_in_path.push_back(1); reverse(nodes_in_path.begin(), nodes_in_path.end()); // make cycle a vector node = p_cyc[1]; while(node != 1){ nodes_in_cycle.push_back(node); cyc_set.insert(node); node=p_cyc[node]; } nodes_in_cycle.push_back(node); reverse(nodes_in_cycle.begin(), nodes_in_cycle.end()); // find the latest node in path that appears in the cycle int last_common_node=1; for(int i=0; i0 // // Case 3: path and cycle overlap: // Find the first node in 0->1 that exists in the cycle, let's call it X // A goes from 0 to X, drops the used keys, then follows one of the cycle routes to 1. // B takes the other route to 1->X, picks up the keys, then goes X to 0 vector shared_keys; for(int i=nodes_in_path.size()-1; nodes_in_path[i]!=last_common_node; i--){ shared_keys.push_back(get_id(nodes_in_path[i],nodes_in_path[i-1])); } if (last_common_node == 0){ vector a_keys; vector b_keys; int zero_idx = -1; for(int i=0;i=0;i--) printf("MOVE %d\n",nodes_in_cycle[i]); printf("DONE\n"); for(int i=nodes_in_cycle.size()-1;i>=zero_idx;i--) printf("MOVE %d\n",nodes_in_cycle[i]); printf("DONE\n"); } else if (last_common_node == 1){ vector a_keys; for(int i=0; i=0;i--) printf("MOVE %d\n",nodes_in_path[i]); for(int i=1; i=0;i--) printf("MOVE %d\n",nodes_in_cycle[i]); printf("DONE\n"); printf("MOVE %d\n",nodes_in_cycle.back()); printf("GRAB\n"); for(int i=0;i a_keys; vector b_keys; for(x_idx=0;nodes_in_cycle[x_idx]!=last_common_node;x_idx++) a_keys.push_back(get_id(nodes_in_cycle[x_idx],nodes_in_cycle[x_idx+1])); for(int i=x_idx;i=0;i--) printf("MOVE %d\n",nodes_in_cycle[i]); printf("DONE\n"); for(int i=nodes_in_cycle.size()-1;i>=x_idx;i--) printf("MOVE %d\n",nodes_in_cycle[i]); printf("GRAB\n"); int i; for(i=0;nodes_in_path[i]!=last_common_node;i++); i++; for(;i