蓝桥杯 危险系数

    xiaoxiao2021-03-26  23

    问题描述

    抗日战争时期,冀中平原的地道战曾发挥重要作用。

    地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。

    我们来定义一个危险系数DF(x,y):

    对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。

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

    输入格式

    输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数;

    接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;

    最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。

    输出格式 一个整数,如果询问的两点不连通则输出-1. 样例输入 7 6 1 3 2 3 3 4 3 5 4 5 5 6 1 6 样例输出

    2

    这道题可以用dfs来解决。如果从a到b可走的n条路中,其中某个点出现了n次,则这个点就是割点,去掉它则不通。

    #include<stdio.h> int net[1001][1001]={0}; int color[1001]={0}; int cnt[1001]={0}; int way[1001]={0}; int ans=0; void dfs(int u,int v,int n,int num) { int i,j; color[u]=1; way[n]=u; //记录每一步所走的结点 if(u==v) { ans++; //记录有几条正确的路 for(j=0;j<=n;j++) { cnt[way[j]]++; //记录点经过的次数 } } else { for(i=1;i<=num;i++) { if(net[u][i]==0 || net[u][i]==999 || color[i]==1) //这条路可以走并且以前没走过 continue; dfs(i,v,n+1,num); color[i]=0; } } } int main(void) { int a,b,n,m,i,j,num=0;; scanf("%d",&n); scanf("%d",&m); for(i=1;i<n+1;i++) { for(j=1;j<n+1;j++) { if(i==j) net[i][j]=0; else net[i][j]=999; } } for(i=0;i<m;i++) { scanf("%d",&a); scanf("%d",&b); net[a][b]=1; net[b][a]=1; } scanf("%d",&a); scanf("%d",&b); dfs(a,b,0,n); for(i=1;i<n+1;i++) { if(cnt[i]==ans) num++; } printf("%d",num-2); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-500184.html

    最新回复(0)