题意:给出一张无向图,求割点个数
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <functional> #include <climits> using namespace std; #define LL long long const int INF=0x3f3f3f3f; const int N=1010; int edge[N][N]; int n,son; int subnet[N],dfn[N],low[N],tmpdfn; bool vis[N]; void init() { tmpdfn=1,son=0; memset(dfn,0,sizeof dfn); memset(low,0,sizeof low); memset(vis,0,sizeof vis); memset(subnet,0,sizeof subnet); } void dfs(int u) { dfn[u]=low[u]=tmpdfn++; vis[u]=true; for(int v=1; v<=n; v++) { if(edge[u][v]) { if(!vis[v]) { dfs(v); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) { if(u!=1) subnet[u]++; else son++; } } else low[u]=min(low[u],dfn[v]); } } } int main() { int u,v; while(~scanf("%d",&n)&&n) { memset(edge,0,sizeof edge); while(scanf("%d",&u)&&u) { char ch; while (scanf("%d%c", &v, &ch)) { edge[u][v]=edge[v][u]=1; if(ch=='\n') break; } } init(); dfs(1); if(son>1) subnet[1]=son-1; int sum=0; for(int i=1;i<=n;i++) if(subnet[i]) sum++; printf("%d\n",sum); } return 0; }