Subtask#0全过,Subtask#1WA掉,求各位大佬帮忙看一看,感激不尽!
// Problem: P5058 [ZJOI2004] 嗅探器
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5058
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Author: Leizijin
//
// Powered by CP Editor (https://cpeditor.org)
// 如果有解,那么答案是图中满足下列条件的点
//
// 1.在所有a to b的路径上
// 2.是图的割点
// 3.编号在所有满足上述条件的点中序号最小
//
// ina[u], inb[u]分别表示a/b是否在以u为根的dfs搜索树当中
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pb push_back
#define pii pair<ll,ll>
#define il inline
#define fastio ios::sync_with_stdio(false), cin.tie(0)
const int N = 7e5+5;
vector<int> G[N];
int dfn[N], low[N], cnt[N], ANS = INT_MAX;
int DFN_CLOCK;
bool is_bridge[N],ain[N],bin[N];
int A,B;
void Init(){
DFN_CLOCK = 0;
for(int i=0; i<N; i++) G[i].clear();
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(is_bridge, 0, sizeof(is_bridge));
memset(cnt, 0, sizeof(cnt));
}
void Tarjan(int u, int pre){
dfn[u] = low[u] = ++DFN_CLOCK;
if(u == A) ain[u] = 1;
if(u == B) bin[u] = 1;
int son = 0, first_son = 0, siz = G[u].size();
for(int i=0,v; i<siz; i++){
v = G[u][i];
if(v == pre) continue;
if(!dfn[v]){
son ++;
if(son == 1) first_son = v;
Tarjan(v, u);
ain[u] |= ain[v], bin[u] |= bin[v];
if((u != pre && low[v] >= dfn[u]) || (u == pre && son > 1) && u!=A && u!=B){
is_bridge[u] = 1;
if(ain[v] ^ bin[v]){
ANS = min(ANS, u);
}
}
low[u] = min(low[u], low[v]);
}
else{
low[u] = min(low[u], dfn[v]);
}
}
if(u == pre && son >= 2){ // update first_son
if(ain[first_son] ^ bin[first_son] && u!=A && u!=B){ // 不能删掉主机?
ANS = min(ANS, u);
}
}
}
int n;
signed main(){
fastio;
cin >> n;
int u,v;
while(cin >> u >> v, u && v){
G[u].pb(v), G[v].pb(u);
}
cin >> A >> B;
if(A == B){
printf("No solution\n");
return 0;
}
for(int i=1; i<=n; i++) Tarjan(i, i);
if(ANS == INT_MAX){
printf("No solution\n");
}
else{
printf("%d\n", ANS);
}
return 0;
}
// 第一遍提交WA on Subtask 1,原数据满分