zoukankan      html  css  js  c++  java
  • uva-315.network(连通图的割点)

    本题大意:求一个无向图额割点的个数.

    本题思路:建图之后打一遍模板.

     1 /*************************************************************************
     2     > File Name: uva-315.network.cpp
     3     > Author: CruelKing
     4     > Mail: 2016586625@qq.com 
     5     > Created Time: 2019年09月06日 星期五 17时15分07秒
     6     本题思路:就是求图中有多少个割点
     7  ************************************************************************/
     8 
     9 #include <cstdio>
    10 #include <iostream>
    11 #include <sstream>
    12 #include <cstring>
    13 #include <string>
    14 using namespace std;
    15 
    16 const int maxn = 100 + 5, maxm = maxn * maxn + 5;
    17 int tot, head[maxn];
    18 
    19 struct Edge {
    20     int to, next;
    21 } edge[maxm];
    22 
    23 void init() {
    24     memset(head, -1, sizeof head);
    25     tot = 0;
    26 }
    27 
    28 void addedge(int u, int v) {
    29     edge[tot] = (Edge) {v, head[u]}; head[u] = tot ++;
    30     edge[tot] = (Edge) {u, head[v]}; head[v] = tot ++;
    31 }    
    32 
    33 int n;
    34 string str;
    35 
    36 int dfn[maxn], low[maxn], stack[maxn];
    37 bool cut[maxn], instack[maxn];
    38 int Index, top, cut_num;
    39 
    40 void tarjan(int u, int pre) {
    41     dfn[u] = low[u] = ++ Index;
    42     instack[u] = true;
    43     stack[top ++] = u;
    44     int son = 0;
    45     for(int i = head[u]; ~i; i = edge[i].next) {
    46         int v = edge[i].to;
    47         if(!dfn[v]) {
    48             son ++;
    49             tarjan(v, u);
    50             if(low[u] > low[v]) low[u] = low[v];
    51             if(pre != u && low[v] >= dfn[u]) {
    52                 cut[u] = true;
    53             }
    54         } else if(low[u] > dfn[v]) low[u] = dfn[v];
    55     }
    56     if(u == pre && son > 1) {
    57         cut[u] = true;
    58     }
    59     instack[u] = false;
    60     top --;
    61 }
    62 
    63 void solve() {
    64     memset(dfn, 0, sizeof dfn);
    65     memset(low, 0, sizeof low);
    66     memset(cut, false, sizeof cut);
    67     Index = top = cut_num = 0;
    68     for(int i = 1; i <= n; i ++) {
    69         if(!dfn[i]) tarjan(i, i);
    70     }
    71     for(int i = 1; i <= n; i ++) if(cut[i]) cut_num ++;
    72     printf("%d
    ", cut_num);
    73 }
    74 
    75 int main() {
    76     int u, v;
    77     while(~scanf("%d", &n) && n) {
    78         init();
    79         while(scanf("%d", &u)) {
    80             if(u == 0) break;
    81             getline(cin, str);
    82             stringstream ss;
    83             ss << str;
    84             while(ss >> v) addedge(u, v);
    85         }
    86         solve();
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    openssl对数组加密解密的完整实现代码
    OpenSSl 加密解密 示例(终于有编程实践了)
    QT中QProcess调用命令行的痛苦经历(调用Winrar,设置工作目录,获得输出,注意引号与括号,等等)
    Ubuntu 14.04远程登录服务器--openssh的安装和配置简明步骤
    可复用的批量文件修改工具
    TFS二次开发、C#知识点、SQL知识
    Backbone.js的技巧和模式
    Hibernate:如何映射聚合?
    JavaScript之创建对象
    为什么选择MongoDB?
  • 原文地址:https://www.cnblogs.com/bianjunting/p/11477175.html
Copyright © 2011-2022 走看看