P8604 [蓝桥杯 2013 国 C] 危险系数 题解
题意:给定一张无向图和点 $s,t$,求有多少个点 $x$ 使得删去点 $x$ 后 $s,t$ 不连通。
思路
观察到 $n,m$ 很小,考虑暴力做法。
枚举每个点作为 $x$,$O(n+m)$ 跑一遍 BFS 验证不经过 $x$ 时 $s,t$ 是否连通。
BFS 时避免扩展点 $x$ 即可保证 $s\to t$ 的路径不经过 $x$。
#include <queue>
#include <cstdio>
using namespace std;
struct E{int v, t;}e[4050];queue<int> q;
int n, m, u, v, s, t, p, c, h[1050];bool d[1050];
void A(int u, int v) {e[++c] = {v, h[u]};h[u] = c;}
bool F(int x)
{
for(int i = 1;i <= n;++i) d[i] = 1;
d[s] = 0;q.push(s);while(!q.empty())
{
int u = q.front();q.pop();if(u != x)
for(int i = h[u], v;i;i = e[i].t) if
(d[v = e[i].v]) d[v] = 0, q.push(v);
}
return d[t];
}
int main()
{
scanf("%d%d", &n, &m);while(m--) scanf
("%d%d", &u, &v), A(u, v), A(v, u);scanf
("%d%d", &s, &t);if(F(0)) return puts("-1")
, 0;for(int i = 1;i <= n;++i) p += i != s
&& i != t && F(i);return printf("%d", p), 0;
}