链接:点击打开链接
题意:求无向图中割点个数
代码:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
set<int> se;
vector<int> G[105];
int dfn[105],low[105],vis[105];
void dfs(int S,int &id){
int i,u,v,tmp=0;
vis[S]=1;
dfn[S]=low[S]=id++;
for(i=0;i<G[S].size();i++){
u=G[S][i];
if(vis[u]==0){
dfs(u,id);
tmp++;
low[S]=min(low[S],low[u]);
if(tmp>1&&S==1) //dfs搜索树中根节点分支大于一
se.insert(1);
if(S!=1&&low[u]>=dfn[S]) //子节点沿回边走到的dfs序最小值大于
se.insert(S); //等于父节点的dfs序的值
} //这两种情况必为割点,复杂度O(n+m)
else
low[S]=min(low[S],dfn[u]);
}
}
int main(){
int n,u,v,i,j,id;
while(scanf("%d",&n)&&n){
for(i=1;i<=n;i++){
vis[i]=0;
G[i].clear();
}
while(scanf("%d",&u)&&u){
while(getchar()!='\n'){
scanf("%d",&v);
G[u].push_back(v);
G[v].push_back(u);
}
}
id=1;
se.clear();
dfs(1,id);
printf("%d\n",se.size());
}
return 0;
}