zoukankan      html  css  js  c++  java
  • 蓝桥杯PREV-12(dfs&割点)

    题目链接:http://lx.lanqiao.cn/problem.page?gpid=T35

    题意:中文题诶~

    思路:dfs

    假设star 和 end之间总路径数目为ans, 那么若经过路径上某点到达终点的路径数为ans,则此点必为割点(所有路径都要经过此点,去掉了s就到不了e了嘛~);

    所以我们只要找出经过各个点到达终点的路径数目问题也就解决了,很显然直接dfs就好啦;

    代码:

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <vector>
     4 #define MAXN 1010
     5 using namespace std;
     6 
     7 vector<int> mp[MAXN];
     8 int vis[MAXN], ans=0;//vis记录经过点i能到达终结点的路径数目
     9 int pre[MAXN];//记录路径
    10 bool flag[MAXN];
    11 
    12 void dfs(int cnt, int e, int n){
    13     pre[n]=cnt;//记录当前点
    14     if(cnt==e){
    15         ans++;
    16         for(int i=0; i<=n; i++){//当前路径上的所有节点的vis值加一
    17             vis[pre[i]]++;
    18         }
    19         return;
    20     }
    21     for(int i=0; i<mp[cnt].size(); i++){
    22         if(!flag[mp[cnt][i]]){
    23             flag[mp[cnt][i]]=true;
    24             dfs(mp[cnt][i], e, n+1);
    25             flag[mp[cnt][i]]=false;
    26         }
    27     }
    28 }
    29 
    30 void solve(int n, int s, int e){
    31     int cnt=0;
    32     for(int i=1; i<=n; i++){
    33         if(vis[i]>=ans&&i!=s&&i!=e){//若到达终结点的所有路径都经过节点i且节点i不为起点和终点,则其为割点
    34             cnt++;
    35         }
    36     }
    37     printf("%d
    ", cnt);
    38 }
    39 
    40 int main(void){
    41     int n, m, x, y;
    42     scanf("%d%d", &n, &m);
    43     while(m--){
    44         scanf("%d%d", &x, &y);
    45         mp[x].push_back(y);
    46         mp[y].push_back(x);
    47     }
    48     int s, e;
    49     scanf("%d%d", &s, &e);
    50     flag[s]=true;
    51     dfs(s, e, 0);
    52     solve(n, s, e);
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    禅道学习(一)
    遍历
    php特性
    jsonRPC
    model
    水仙花数(详细2
    水仙花数(详细1
    递归求n 项和
    poj 1651
    nyist 289
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6568604.html
Copyright © 2011-2022 走看看