namespace SHAWN { constint N = 1e6 + 7; int head[N], cnt; structedge { int to, next; }edge[N]; int n, tim, x, y; int dfn[N], low[N]; bool vis[N], flag[N];
inlinevoidadd(int u, int v){ edge[++cnt].next = head[u]; edge[cnt].to = v; head[u] = cnt; }
voidTarjan(int u, int fa){ low[u] = dfn[u] = ++tim; vis[u] = true; for (int i = head[u]; i; i = edge[i].next) { int v = edge[i].to; if (!vis[v]) { Tarjan(v, u); low[u] = min(low[u], low[v]); // 这里多加一个u!=x和dfn[y]>=dfn[v]的特判就OK了 if (fa != u && low[v] >= dfn[u] && u != x && dfn[y] >= dfn[v]) { flag[u] = true; } } elseif (fa != v) { low[u] = min(low[u], dfn[v]); } } }
intwork() { cin >> n; while (cin >> x >> y && x && y) { add(x, y); add(y, x); } cin >> x >> y; Tarjan(x, x); for (int i = 1; i <= n; ++i) { if (flag[i]) { cout << i << '\n'; return0; } } cout << "No solution\n"; return0; } }