比較裸的割點,多了個求割點的度,注意輸入輸出格式
#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) ;
}
}