无向图求割点的模板题
#include <stdio.h>
#include <string.h>
const int maxn = 1111;
struct EDGE{
int to, next;
}edge[maxn<<2];
int head[maxn], iscut[maxn], dfn[maxn], low[maxn], subnet[maxn], E, time;
void newedge(int u, int to) {
edge[E].to = to;
edge[E].next = head[u];
head[u] = E++;
}
void init() {
memset(head, -1, sizeof(head));
memset(dfn, 0, sizeof(dfn));
memset(iscut, 0, sizeof(iscut));
memset(subnet, 0, sizeof(subnet));
time = E = 0;
}
int min(int a, int b) {
return a > b ? b : a;
}
void dfs(int u, int pre) {
dfn[u] = low[u] = ++time;
for(int i = head[u];i != -1;i = edge[i].next) {
int to = edge[i].to;
if(!dfn[to]) {
dfs(to, u);
low[u] = min(low[u], low[to]);
if(low[to] >= dfn[u]) {
subnet[u]++;
iscut[u] = 1;
}
}
else if(to != pre)
low[u] = min(low[u], low[to]);
}
}
int main() {
int u, to, n = 1000, i;
int cas = 1;
while(scanf("%d", &u) != -1 && u) {
init();
scanf("%d", &to);
newedge(u, to);
newedge(to, u);
while(scanf("%d", &u) != -1 && u) {
scanf("%d", &to);
newedge(u, to);
newedge(to, u);
}
for(i = 1;i <= n; i++) if(!dfn[i]){
dfs(i, -1);
subnet[i]--;
if(subnet[i] <= 0) iscut[i] = 0;
}
printf("Network #%d\n", cas++);
int ok = 0;
for(i = 1;i <= n; i++) if(iscut[i])
printf(" SPF node %d leaves %d subnets\n", i, subnet[i]+1) , ok = 1;
if(!ok) puts(" No SPF nodes");
puts("");
}
return 0;
}