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;
}
posted @ 2022-11-15 18:53  5k_sync_closer  阅读(31)  评论(0编辑  收藏  举报  来源