vb createStack(mvb &Map, vb Boxes, int bottom) { if (Map.count(bottom)!= 0 && bottom < Boxes.size()) { return Map[bottom]; } int max_height = 0; vb max_stack; if (bottom >= Boxes.size()) { return max_stack; } for (int i = 0; i < Boxes.size(); ++i) { if (Boxes[i].canBeAbove(Boxes[bottom])) { vb tmpStack = createStack(Map, Boxes, i); int tmpHeight = stackHeight(tmpStack); if (tmpHeight > max_height) { print(); max_stack = tmpStack; max_height = tmpHeight; } } } //Push Boxes[bottom] to font hee max_stack.push_back(Boxes[bottom]); Map[bottom] = max_stack; return max_stack; }
float stackHeight(vb Boxes){ float height = 0; for (int i = 0; i < Boxes.size(); ++i) { height += Boxes[i].getDepth(); } return height; }
void bellmann_ford_extended(vvii &e, int source, vi &dist, vb &cyc) { dist.assign(e.size(), INF); cyc.assign(e.size(), false); // true when u is in a <0 cycle dist[source] = 0; for (int iter = 0; iter < e.size() - 1; ++iter){ bool relax = false; for (int u = 0; u < e.size(); ++u) if (dist[u] == INF) continue; else for (auto &e : e[u]) if(dist[u]+e.second < dist[e.first]) dist[e.first] = dist[u]+e.second, relax = true; if(!relax) break; } bool ch = true; while (ch) { // keep going untill no more changes ch = false; // set dist to -INF when in cycle for (int u = 0; u < e.size(); ++u) if (dist[u] == INF) continue; else for (auto &e : e[u]) if (dist[e.first] > dist[u] + e.second && !cyc[e.first]) { dist[e.first] = -INF; ch = true; //return true for cycle detection only cyc[e.first] = true; } } }
int main() { FILE *in = fopen (PROBLEM_NAME".in","r"); FILE *out = fopen (PROBLEM_NAME".out","w"); int k; fscanf(in, "%d %d ", &n, &k); for (int i = 0; i < n; ++i) { used.push_back(false); tin.push_back(0); fup.push_back(0); vi l; g.push_back(l); } for (int i = 0; i < k; ++i) { int x, y; fscanf(in, "%d %d ", &x, &y); g[x-1].push_back(y-1); g[y-1].push_back(x-1); } timer = 0; dfs(0); sort(ans.begin(), ans.end()); ans.erase( unique( ans.begin(), ans.end() ), ans.end() ); fprintf(out, "%d\n", (int)ans.size()); for (size_t i = 0; i < ans.size(); ++i) { fprintf(out, "%d\n", ans[i]+1); } fclose(in); fclose(out); return 0; }
bool optimal(int N, vvii &E, int &opt, vb &flip) { bool consistent = true; vi status(N, -1LL); vi comp(N, -1LL); int C = 0; for (int u = 0; u < N; ++u) { if (status[u] >= 0) continue; comp[u] = C; status[u] = 0LL; queue<int> q; q.push(u); while (!q.empty()) { int v = q.front(); q.pop(); for (ii wt : E[v]) { int w = wt.first, t = wt.second; if (status[w] == -1LL) { status[w] = (status[v] + t) % 2; comp[w] = C; q.push(w); } else { if (t == 0 && status[w] != status[v]) consistent = false; if (t == 1 && status[w] == status[v]) consistent = false; } } } ++C; } vvi side(2, vi(C, 0LL)); for (int u = 0; u < N; ++u) { side[status[u]][comp[u]]++; } opt = 0; flip.assign(N, false); vb comp_flip(C, false); for (int c = 0; c < C; ++c) { if (side[0][c] > side[1][c]) comp_flip[c] = true; opt += min(side[0][c], side[1][c]); } for (int u = 0; u < N; ++u) { if (status[u] == 0 && !comp_flip[comp[u]]) flip[u] = true; if (status[u] == 1 && comp_flip[comp[u]]) flip[u] = true; } return consistent; }
CentroidDecomposition(vvi &tree) : e(tree) { int V = e.size(); tocheck.assign(V, true); cd.assign(V, vi()); dir.assign(V, vi()); p.assign(V, -1); size.assign(V, 0); dfs(0); root = decompose(0, V); }
int dijkstra(int srci,int dsti) { int i,j,k,v,cost; spii S; pii p,top; fill(visited.begin(),visited.begin()+n+1,false); fill(D.begin(),D.begin()+n+1, SENTINEL); D[srci]=0; S.insert(pii(0,srci)); while(!S.empty()){ top=*(S.begin()); S.erase(S.begin()); int d = top.first, u = top.second; if(u==dsti) return D[dsti]; for(i=0;i<adjcnt[u];i++){ v=AL[u][i].first; cost = AL[u][i].second; if(D[v]>D[u]+cost){ if(D[v]!=SENTINEL) S.erase(find(all(S),make_pair(D[v],v))); D[v]=D[u]+cost; S.insert(make_pair(D[v],v)); } } } }
int main() { freopen("input.txt", "r", stdin); int n, t; cin >> n; g.assign(n, vi(0)); // read graph for (int i = 0; i < n; ++i) { scanf("%d", &t); g[i].assign(t, 0); for (int j = 0; j < t; ++j) { scanf("%d", &g[i][j]); g[i][j]--; } } // partitioning group.assign(n, 0); used.assign(n, false); for (int i = 0; i < n; ++i) { if (!used[i]) dfs(i, 0); } // output int count = 0, gr = 0; for (int i = 0; i < n; ++i) if (group[i] == 0) count++; if (count > n - count) gr = 1, count = n - count; if (count == n - count) gr = group[0]; printf("%d\n", count); for (int i = 0; i < n; ++i) { if (group[i] == gr) { printf("%d ", i + 1); } } printf("\n"); return 0; }
int main() { FILE *in = fopen (PROBLEM_NAME".in","r"); FILE *out = fopen (PROBLEM_NAME".out","w"); fscanf(in, "%d", &n); for (int i = 0; i < n; ++i) { tin.push_back(0); tout.push_back(0); used.push_back(false); vi l; g.push_back(l); } for (int i = 0; i < n; ++i) { int p; fscanf(in, "%d", &p); if (p == 0) { root = i; } else { g[p-1].push_back(i); } } timer = 0; dfs(root); // print(); int k; fscanf(in, "%d", &k); for (int i = 0; i < k; ++i) { int a, b; fscanf(in, "%d %d", &a, &b); int res = (upper(a-1, b-1)) ? 1 : 0; fprintf(out, "%d\n", res); } fclose(in); fclose(out); return 0; }
int main() { int num = 0, cases; cin >> cases >> ws; while(num < cases) { int n; cin >> n >> ws; // Init graph.assign(n + 1, int()); length.assign(n + 1, -1); // Read in edges int a, b; for (int i = 1; i <= n; ++i) { cin >> a >> b >> ws; graph[a] = b; } int max = -1, max_index = -1; for (int i = 1; i <= n; ++i) { if(length[i] == -1) { // Reset visited list visited.assign(n + 1, false); // Calculate path length of i & children length[i] = dfs(i); // New largest path length if(length[i] > max) { max_index = i; max = length[i]; } } } // Print solution cout << "Case " << ++num << ": " << max_index << endl; } return 0; }
int main() { // freopen("input.txt", "r", stdin); int n; cin >> n; g.assign(n, vi()); used.assign(n, false); values.assign(n, 0); int t, v; cin >> t; values[0] = t; for (int i = 1; i < n; ++i) { cin >> t >> v; g[t - 1].push_back(i); values[i] = v; } // for (size_t i = 0; i < g.size(); ++i) { // cout << i << "(" << values[i] << "): "; // for (size_t j = 0; j < g[i].size(); ++j) { // cout << g[i][j] << " (" << values[g[i][j]] << ") "; // } // cout << endl; // } // // for (size_t i = 0; i < values.size(); ++i) { // cout << values[i] << " "; // } // cout << endl; dfs(0); cout << values[0] << endl; return 0; }