【蓝桥杯】危险系数

来源:互联网 发布:手机音频编辑软件中文 编辑:程序博客网 时间:2024/05/11 20:39

#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;             //清除标记 } }}


0 0
原创粉丝点击