zoukankan      html  css  js  c++  java
  • POJ 1144 Network(无向图的割顶和桥模板题)

    http://poj.org/problem?id=1144

    题意:

    给出图,求割点数。

    思路:

    关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.csdn.net/stillxjy/article/details/70176689

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<stack>
     7 #include<queue>
     8 #include<cmath>
     9 #include<map>
    10 using namespace std;
    11 
    12 const int maxn=100+5;
    13 
    14 int n;
    15 vector<int> G[maxn];
    16 int pre[maxn],low[maxn];
    17 int iscut[maxn];
    18 int dfs_clock;
    19 
    20 int dfs(int u,int fa)
    21 {
    22     int lowu=pre[u]=++dfs_clock;
    23     int child=0;
    24     for(int i=0;i<G[u].size();i++)
    25     {
    26         int v=G[u][i];
    27         if(!pre[v])
    28         {
    29             child++;
    30             int lowv=dfs(v,u);
    31             lowu=min(lowu,lowv);
    32             if(lowv>=pre[u])  iscut[u]=true;
    33         }
    34         else if(pre[v]<pre[u] && v!=fa)
    35             lowu=min(lowu,pre[v]);
    36     }
    37     if(fa<0&&child==1)  iscut[u]=0;
    38     low[u]=lowu;
    39     return lowu;
    40 }
    41 
    42 int get_int(char s[])
    43 {
    44     int m=0;
    45     for(int i=0;s[i];i++)
    46         m=m*10+s[i]-'0';
    47     return m;
    48 }
    49 
    50 int main()
    51 {
    52     //freopen("D:\input.txt","r",stdin);
    53     while(~scanf("%d",&n) && n)
    54     {
    55         for(int i=1;i<=n;i++)  G[i].clear();
    56         memset(pre,0,sizeof(pre));
    57         memset(low,0,sizeof(low));
    58         memset(iscut,0,sizeof(iscut));
    59         dfs_clock=0;
    60 
    61         char s[5];
    62         while(scanf("%s",&s))
    63         {
    64             if(s[0]=='0')  break;
    65             int u=get_int(s);
    66             while(scanf("%s",&s))
    67             {
    68                 int v=get_int(s);
    69                 G[u].push_back(v);
    70                 G[v].push_back(u);
    71                 if(getchar()=='
    ')   break;
    72             }
    73         }
    74         int ans=0;
    75         dfs(1,-1);
    76         for(int i=1;i<=n;i++)
    77             if(iscut[i])  ans++;
    78         printf("%d
    ",ans);
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    Linux下gdb调试(tui)
    gdb tui中切换窗口
    gdb调试时的问题Missing separate debuginfos, use: debuginfo-install glibc-XXX
    进程间通信
    深入理解计算机系统结构——链接
    系统调用
    模块机制
    其他文件系统
    Oracle数据库逻辑迁移之数据泵的注意事项
    Oracle 10g DG 数据文件迁移
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6776947.html
Copyright © 2011-2022 走看看