找关节点及其联通分量:
Tarjan算法:
/*
Author:ShellDawn
Date:2019-07-09
*/
//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define long long LL
#define MM(x) memset(x,0,sizeof(x))
#define BH(x) priority_queue<x>
#define SH(x) priority_queue<x,vector<x>,greater<x> >
#define maxn 1005
int N;
int E[maxn][maxn];
int low[maxn];
int dfn[maxn];
int visited[maxn];
int subnets[maxn];
int now;
void dfs(int x){
for(int i=1;i<=N;i++){
if(E[x][i]){
if(visited[i] == 0){
visited[i] = 1;
dfn[i] = low[i] = now++;
dfs(i);
low[x] = min(low[x],low[i]);
if(low[i] >= dfn[x]) subnets[x]++;
}else{
low[x] = min(dfn[i],low[x]);
}
}
}
}
int main(){
int cnt = 1;
while(1){
int a;
scanf("%d",&a);
if(a==0) break;
if(cnt>1) puts("");
printf("Network #%d\n",cnt++);
MM(E);
N = 0;
int b;
scanf("%d",&b);
E[a][b] = E[b][a] = 1;
N = max(N,a);
N = max(N,b);
while(1){
scanf("%d",&a);
if(a==0) break;
scanf("%d",&b);
E[a][b] = E[b][a] = 1;
N = max(N,a);
N = max(N,b);
}
MM(visited);
MM(subnets);
visited[1] = 1;
dfn[1] = low[1] = 1;
now = 2;
dfs(1);
bool flag = false;
if(subnets[1]>=2){
flag = true;
printf(" SPF node %d leaves %d subnets\n",1,subnets[1]);
}
for(int i=2;i<=N;i++){
if(subnets[i]){
flag = true;
printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+1);
}
}
if(!flag) puts(" No SPF nodes");
}
return 0;
}