zoukankan      html  css  js  c++  java
  • POJ 1523 SPF(求割点)

    题目链接

    题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量。

    思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边。

     1 //poj1523
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 
     6 using namespace std ;
     7 
     8 int edge[1010][1010],dfn[1010],low[1010],subnet[1010] ;
     9 int tot,Node ,son;
    10 
    11 void dfs(int u)
    12 {
    13     dfn[u] = low[u] = ++tot ;
    14     for(int v = 1 ; v <= Node ; v++)
    15     {
    16         if(edge[u][v])
    17         {
    18             if(!dfn[v])
    19             {
    20                 dfs(v) ;
    21                 low[u] = min(low[v],low[u]) ;
    22                 if(low[v] >= dfn[u])
    23                 {
    24                     if(u != 1)//非根节点
    25                         subnet[u] ++ ;
    26                     else son ++ ;
    27                 }
    28             }
    29             else
    30             {
    31                 low[u] = min(low[u],dfn[v]) ;
    32             }
    33         }
    34     }
    35 }
    36 
    37 void Init()
    38 {
    39     tot = son = Node = 0;
    40     memset(dfn,0,sizeof(dfn)) ;
    41     memset(low,0,sizeof(low)) ;
    42     memset(subnet,0,sizeof(subnet)) ;
    43     memset(edge,0,sizeof(edge)) ;
    44 }
    45 int main()
    46 {
    47     int m,n ;
    48     int casee = 1 ;
    49     while(scanf("%d",&m) && m)
    50     {
    51         scanf("%d",&n) ;
    52         Init() ;
    53         Node = max(m,max(n,Node)) ;
    54         edge[m][n] = edge[n][m] = 1 ;
    55         while(~scanf("%d",&m) && m)
    56         {
    57             scanf("%d",&n) ;
    58             Node = max(m,max(n,Node)) ;
    59             edge[m][n] = edge[n][m] = 1 ;
    60         }
    61 //        if(casee > 1)
    62 //            puts("") ;
    63         printf("Network #%d
    ",casee ++) ;
    64         dfs(1) ;
    65         if(son > 1)
    66             subnet[1] = son - 1 ;
    67         int flag = 0 ;
    68         for(int i = 1 ; i <= Node ; i++){
    69             if(subnet[i])
    70             {
    71                 flag = 1 ;
    72                 printf("  SPF node %d leaves %d subnets
    ",i,subnet[i]+1) ;
    73             }
    74         }
    75         if(!flag)
    76             puts("  No SPF nodes") ;
    77         puts("") ;
    78     }
    79     return 0 ;
    80 }
    View Code
  • 相关阅读:
    转载文章:用.NET开发MSN聊天机器人 MSN聊天机器人开发揭秘
    ppc全屏程序(转)
    表设计中遇到的多对多的关系解决方案 (zt)
    using ZedGraph
    DataTable.Select(expression)
    你认识它吗?什么是QR码?
    分享《Windows Mobile平台应用与开发》源代码
    收藏信息
    六世喇嘛仓央嘉措诗集
    使用Axis开发Web Service程序
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3906451.html
Copyright © 2011-2022 走看看