voiddfs(int x){ while (!adj[x].empty()) { int t = *adj[x].begin(); adj[x].erase(adj[x].begin()); dfs(t); } res.push_back(x); }
intmain(){ int n, m; cin >> n >> m; for (int i = 1; i <= m; ++i) { int x, y; cin >> x >> y; adj[x].insert(y); deg[x]++, indeg[y]++; } int beg = -1, des = -1; for (int i = 1; i <= n; ++i) { if (abs(deg[i] - indeg[i]) > 1) { cout << "No\n"; return0; } if (deg[i] == indeg[i] + 1) { if (beg == -1) beg = i; else { cout << "No\n"; return0; } } elseif (deg[i] == indeg[i] - 1) { if (des == -1) des = i; else { cout << "No\n"; return0; } } } if (beg != -1) dfs(beg); elsedfs(1); reverse(res.begin(), res.end()); if (res.size() != m + 1) { cout << "No\n"; return0; } for (auto x : res) cout << x << ' '; cout << '\n'; return0; }
voidtasks(){ int n, m, s; cin >> n >> m >> s; vector<vector<Node>> adj(n + 1); for (int i = 1; i <= m; ++i) { int u, v; ll w; cin >> u >> v >> w; adj[u].emplace_back(v, w); } vector<ll> dis(n + 1, INF); dis[s] = 0; priority_queue<Node> pq; pq.emplace(s, dis[s]); vector<bool> vis(n + 1, false); while (!pq.empty()) { auto sto = pq.top(); pq.pop(); int t = sto.id, d = sto.w; if (vis[t]) continue; vis[t] = true; for (constauto& it : adj[t]) { int u = it.id; ll w = it.w; if (dis[u] > dis[t] + w) { dis[u] = dis[t] + w; pq.emplace(u, dis[u]); } } } for (int i = 1; i <= n; ++i) cout << dis[i] << ' '; cout << EL; }
voidunion_set(int x, int y){ int rx = find_ast(x); int ry = find_ast(y); if (rx != ry) { ast[ry] = ast[rx]; } }
intkruskal(){ sort(edges.begin(), edges.end()); int res = 0; int cnt = 0; for (auto &eg : edges) { int weight = eg.first; int u = eg.second.first; int v = eg.second.second; if (find_ast(u) != find_ast(v)) { union_set(u, v); res += weight; cnt++; } if (cnt == n - 1) break; } if (cnt < n - 1) return-1; return res; }
voiddfs(int x){ for (int k = 0; k < B; ++k) { fa[x][k + 1] = fa[fa[x][k]][k]; } for (int y : e[x]) { fa[y][0] = x, dep[y] = dep[x] + 1, dfs(y); } }
intlca(int x, int y){ if (dep[x] < dep[y]) std::swap(x, y); for (int k = B; ~k; --k) { if (fa[x][k] && dep[fa[x][k]] >= dep[y]) { x = fa[x][k]; } } if (x == y) return x; for (int k = B; ~k; --k) { if (fa[x][k] != fa[y][k]) x = fa[x][k], y = fa[y][k]; } return fa[x][0]; }
intmain(){ std::cin >> n >> m; for (int i = 0; i < m; ++i) { std::cin >> ed[i].u >> ed[i].v >> ed[i].w; } std::sort(ed, ed + m); for (int i = 1; i <= 2 * n; ++i) { pr[i] = i; } id = n; for (int i = 0; i < m; ++i) { int u = find(ed[i].u), v = find(ed[i].v); if (u == v) continue; pr[u] = pr[v] = ++id, e[id] = {u, v}, w[id] = ed[i].w; // 建立重构树 } for (int i = 1; i <= id; ++i) { if (pr[i] == i) dfs(i); } int q, x, y; std::cin >> q; while (q--) { std::cin >> x >> y; std::cout << (find(x) == find(y) ? w[lca(x, y)] : -1) << '\n'; }