• C


    题目链接:https://cn.vjudge.net/contest/247936#problem/C

    具体大意:给你起点和中点,总点数,边数。求到终点的最小割点。

    具体思路:可以用tarjan算法来求割点,不过还有一种比较朴素的求法。假设一共有五个点,起点是1,终点是5.我们可以先将除起点和终点之外的点罗列出来,然后假设某一个点以及这个点所连的边不存在,然后再看一下其他点中到终点的个数,这样也可以求出最小割点来。(过会再更新tarjan算法求割点)

    AC代码:

     1 #include<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<iomanip>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<stdio.h>
     8 #include<map>
     9 #include<queue>
    10 #include<stack>
    11 #include<vector>
    12 using namespace std;
    13 # define maxn 100
    14 # define  ll long long
    15 #define inf 0x3f3f3f3f
    16 #define ll_inf 0x3f3f3f3f3f3f3f3f
    17 vector<int >q[maxn];
    18 int n,m,fin;
    19 int vis[maxn];
    20 bool flag;
    21 void   dfs(int t1,int t2)
    22 {
    23     if(t1==fin)
    24     {
    25         flag=true;
    26         return ;
    27     }
    28     int len=q[t1].size();
    29     for(int i=0; i<len; i++)
    30     {
    31         int temp=q[t1][i];
    32         if(q[t1][i]==t2)continue;
    33         if(vis[temp]==0)
    34         {
    35             vis[temp]=1;
    36             dfs(temp,t2);
    37         }
    38     }
    39 }
    40 int Find(int t)
    41 {
    42     int ans=0;
    43     for(int i=1; i<=n; i++)//cal except i
    44     {
    45         flag=false;
    46         memset(vis,0,sizeof(vis));
    47         if(i==t||i==fin)continue;
    48         dfs(i,t);
    49         if(flag)ans++;
    50     }
    51     return ans;
    52 }
    53 void init(){
    54 for(int i=1;i<=n;i++){
    55     q[i].clear();
    56 }
    57 }
    58 int main()
    59 {
    60     while(cin>>n&&n)
    61     {
    62         init();
    63         cin>>fin>>m;
    64         for(int i=1; i<=m; i++)
    65         {
    66             int u,v;
    67             cin>>u>>v;
    68             q[u].push_back(v);
    69             q[v].push_back(u);
    70         }
    71         int minn=inf, t;
    72         for(int i=1; i<=n; i++)//erase i
    73         {
    74             if(i==fin)continue;
    75             if(Find(i)<minn||(Find(i)==minn&&i<t))
    76             {
    77                 minn=Find(i);
    78                 t=i;
    79             }
    80         }
    81         cout<<t<<endl;
    82     }
    83     return 0;
    84 }
    85 
    86  
  • 相关阅读:
    deepin linux 安装 mysql
    Django根据现有数据库建立model
    轻松学习正则表达式
    ubuntu 下安装 wxpython2.8
    Robot framework + appium环境搭建
    使用 robotframework 自动化测试系列 二 -----环境搭建
    使用 robotframework 自动化测试系列 一 -----简介
    执行robot framework 的测试用例 命令行pybot使用方式
    SQLAlchemy的使用---外键ForeignKey数据库创建与连接
    SQLAlchemy的使用---增删改查
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262958.html
Copyright © 2020-2023  润新知