#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node{
int data;
node *next;
};
node tab[1001];
int vis[1001] = { 0 };
int way[1001] = { 0 };
int count[1001] = { 0 };
int ans = 0;
void insert(int n, int x);
void init(int n);
void dfs(int x, int y, int step);
int fun(int n);
int main() {
int x, y, n, m, u, v;
scanf("%d%d", &n, &m);
init(n);
for(int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
insert(u, v);
insert(v, u);
}
scanf("%d%d", &x, &y);
dfs(x, y, 0);
int ret = fun(n);
printf("%d", ret);
return 0;
}
void insert(int n, int x) { //构造临接矩阵
node *p = &tab[n]; //取第n个点的地址
while(p->next != NULL) { //把指针挪到链尾, 插入新的结点
p = p->next;
}
//构造新的结点并插入
node *num = new node;
p->next = num;
num->data = x;
num->next = NULL;
}
void init(int n) { //输入的初始化
for(int i = 1; i <= n; i++) {
tab[i].data = i;
tab[i].next = NULL;
}
}
int fun(int n) {
int res = 0;
for(int i = 1; i <= n; i++) {
if(count[i] == ans) { //如果这个点的通过次数和x,y一样, 那么这个点破坏以后那条路一定被破坏
res++;
}
}
return (res - 2); //去除x, y两个点
}
void dfs(int x, int y, int step) { //深搜从x到y的点
vis[x] = 1; //表示点x已经搜到
way[step] = x; //记录每一步走的哪个点
node *p = &tab[x];
if(x == y) {
ans++; //如果找到了x, 总数加1
for(int i = 0; i <= step; i++) {
count[ way[i] ]++; //则第way[i]个点的路过次数+1
}
return;
}
while((p = p->next) != NULL) { //当前数组元素的临界元素 没有遍历完
if( vis[p->data] != 1 ) {
vis[p->data] = 1; //走过的点进行标记
dfs(p->data, y, step + 1); //深搜下一步
vis[p->data] = 0; //清除标记
}
}
}
【蓝桥杯】危险系数
最新推荐文章于 2021-03-20 12:35:56 发布