本蒟蒻WA了最后一个点,求dalao解释QAQ
#include <bits/stdc++.h>
#define FAST ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug(x) cout<<endl<<#x<<": "<<x<<endl
#define endl "\n"
#define PII pair<int, int >
#define ls p << 1
#define rs (p << 1) + 1
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int N = 4e5 + 10;
int n;
int head[N], cnt;
int S, T;
struct Edge {
int v, nxt;
} e[500010];
void add(int x, int y) {
e[++cnt].v = y, e[cnt].nxt = head[x], head[x] = cnt;
e[++cnt].v = x, e[cnt].nxt = head[y], head[y] = cnt;
}
int dfn[N], low[N], D, tot;
int stk[N], top;
bool cut[N];
vector <int > dcc[N];
void tarjan(int u, int rt) {
dfn[u] = low[u] = ++D;
stk[++top] = u;
int flag = 0;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v;
if(!dfn[v]) {
tarjan(v, rt);
low[u] = min(low[u], low[v]);
if(dfn[u] <= low[v]) {
flag++;
if(u != rt || flag >= 2) cut[u] = true;
int cur;
tot++;
do {
cur = stk[top--];
dcc[tot].push_back(cur);
} while(v != cur);
dcc[tot].push_back(u);
}
} else low[u] = min(dfn[v], low[u]);
}
}
vector <int > path, ne[N];
int id[N], bl[N], num;
unordered_map <int , int > mp;
void shrink() {
num = tot;
for(int i = 1; i <= n; ++i)
if(cut[i]) {
id[i] = ++num;
mp[id[i]] = i;
}
for(int i = 1; i <= tot; ++i)
for(int j : dcc[i]) {
bl[j] = i;
if(cut[j]) {
ne[i].push_back(id[j]);
ne[id[j]].push_back(i);
}
}
}
int ans = 0x3f3f3f3f;
void dfs(int u, int fa, int mi) {
if(u == bl[T]) {
ans = min(ans, mi);
return;
}
int tmp = mi;
for(int v : ne[u]) {
if(v == fa) continue;
if(v > tot && v != bl[S] && v != bl[T]) tmp = min(tmp, mp[v]);
dfs(v, u, tmp);
}
}
signed main() {
FAST;
cin>>n;
int x, y;
while(cin>>x>>y) {
if(!x) break;
add(x, y);
}
cin>>S>>T;
for(int i = 1; i <= n; ++i)
if(!dfn[i]) tarjan(i, i);
shrink();
dfs(bl[S], 0, 0x3f3f3f3f);
if(ans == 0x3f3f3f3f) cout<<"No solution";
else cout<<ans;
return 0;
}