蓝桥杯 历届试题 危险系数(暴力 bfs)

来源:互联网 发布:北大青鸟主机联动编程 编辑:程序博客网 时间:2024/06/06 05:17
题意:我们来定义一个危险系数DF(x,y):
对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。

本题的任务是:已知网络结构,求两站点之间的危险系数。


思路:枚举所有点,判断去掉该点后x,y之间的连通性是否发生变化


代码:

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;const int maxn = 2e3+5;vector<int> g[maxn];bool vis[maxn];int n, m;bool bfs(int u, int v, int z){    memset(vis, 0, sizeof(vis));    queue<int> q;    q.push(u);    vis[u] = 1;    vis[z] = 1;    while(!q.empty())    {        u = q.front(); q.pop();        if(u == v) return 1;        for(int i = 0; i < g[u].size(); i++)        {            int to = g[u][i];            if(!vis[to])            {                vis[to] = 1;                q.push(to);            }        }    }    return 0;}int main(void){    while(cin >> n >> m)    {        for(int i = 0; i < maxn; i++)            g[i].clear();        while(m--)        {            int u, v;            scanf("%d%d", &u, &v);            g[u].push_back(v);            g[v].push_back(u);        }        int x, y;        scanf("%d%d", &x, &y);        int cur = bfs(x, y, 0);        if(!cur) puts("-1");        else        {            int ans = 0;            for(int i = 1; i <= n; i++)            {                if(i != x && i != y)                {                    int tmp = bfs(x, y, i);                    if(!tmp) ans++;                }            }            printf("%d\n", ans);        }    }    return 0;}


原创粉丝点击