POJ 1523 割点

来源:互联网 发布:mac搜狗 工具箱 编辑:程序博客网 时间:2024/04/18 09:23

   比较裸的割点,多了个求割点的度,注意输入输出格式

#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <cassert>#include <algorithm>using namespace std ;const int N = 1000 + 11 ;struct Greaph {struct Edge {int e ;int next ;};Edge err[N<<4] ; int head[N] ; int idx ;int instack[N] ; int dfn[N] ; int low[N] ; int visit_time ; int color ;vector<int> stk ;int degree[N] ;vector<pair<int , int> > que ;    void add_edge(int a , int b) {err[idx].e = b ;err[idx].next = head[a] ;head[a] = idx ++ ;}void init() {memset(head , -1 , sizeof(head)) ;memset(instack , 0 ,sizeof(instack)) ;memset(degree , 0 , sizeof(degree)) ;visit_time = 0 ,color = 2 , idx = 1 ;stk.clear() ;que.clear() ;}void dfs(int u , int fa) {stk.push_back(u) ;instack[u] = 1 ;dfn[u] = low[u] = ++visit_time ;for(int i = head[u] ; i != -1 ; i = err[i].next) {int e = err[i].e ;if(e == fa) continue ;if(instack[e] == 0) {++degree[e] ;dfs(e , u) ;if(low[e] >= dfn[u]) ++degree[u] ;low[u] = min(low[u] , low[e]) ;}else if(instack[e] ==  1) {low[u] = min(low[u] , dfn[e]) ;}}if(low[u] == dfn[u]) {int tmp  ;while(stk.back() != u) {tmp = stk.back() ;stk.pop_back() ;instack[tmp] = 2 ;}stk.pop_back() ;instack[tmp] = 2 ;}if(degree[u] > 1) que.push_back(make_pair(u , degree[u])) ;}void std_fun() {dfs(1 , 0) ;if(que.size() == 0) {printf("  No SPF nodes\n") ;return ;}sort(que.begin() , que.end()) ;for(int i = 0 ; i < que.size() ; ++i) {pair<int ,int> tmp = que[i] ;printf("  SPF node %d leaves %d subnets\n" , tmp.first , tmp.second) ;}}}g ;int main() {int a , b ;int t = 1 ;g.init() ;while(scanf("%d%d" ,&a ,&b) == 2 ) {if(a == 0) {printf("Network #%d\n" ,t++) ;g.std_fun() ;if(b == 0) break ;printf("\n");g.init() ;a = b;scanf("%d" ,&b) ;}g.add_edge(a , b) ;g.add_edge(b , a) ;}}


0 0