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; } } }
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 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() { 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; }