1 条题解
-
0
思路
以中心a为DFS根,仅在包含中心b的子树上用low[child]>=dfn[u]识别分离两端的非端点割点,取编号最小者;不能选只分离无关支路的普通割点,No solution大小写必须一致。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;vector<vector<int>>g(n,vector<int>(n));int u,v;while(cin>>u>>v&&(u||v)){--u;--v;g[u][v]=g[v][u]=1;}int a,b;cin>>a>>b;--a;--b;vector<int>dfn(n),low(n),contains(n);int timer=0,ans=n;function<void(int,int)>dfs=[&](int u,int parent){dfn[u]=low[u]=++timer;contains[u]=(u==b);for(int v=0;v<n;v++)if(g[u][v]){if(!dfn[v]){dfs(v,u);low[u]=min(low[u],low[v]);if(u!=a&&u!=b&&contains[v]&&low[v]>=dfn[u])ans=min(ans,u);contains[u]|=contains[v];}else if(v!=parent)low[u]=min(low[u],dfn[v]);}};dfs(a,-1);if(!dfn[b]||ans==n)cout<<"No solution\n";else cout<<ans+1<<'\n';}
- 1