POJ1144-求图的割点(裸)
来源:互联网 发布:visual studio编程教材 编辑:程序博客网 时间:2024/04/30 15:00
#include <cstdio>#include <iostream>#include <vector>#include <cstring>using namespace std;const int NN=105;vector<int> adj[NN];int n,rt,rt_son;int dfn[NN],low[NN];bool cut[NN];void dfs(int u,int dep){ dfn[u]=low[u]=dep; for (int i=0; i<adj[u].size(); i++) { int v=adj[u][i]; if (!dfn[v]) { dfs(v,dep+1); if (u==rt) rt_son++; else { low[u]=min(low[u],low[v]); if (low[v]>=dfn[u]) cut[u]=true; //由后继节点搜不到比该点更早的点,则该点是割点 } } else low[u]=min(low[u],dfn[v]); }}int main(){ while (scanf("%d",&n)!=EOF && n) { for (int i=1; i<=n; i++) adj[i].clear(); memset(dfn,0,sizeof(dfn)); int u,v; while (scanf("%d",&u),u) { while (getchar()!='\n') { scanf("%d",&v); adj[u].push_back(v); adj[v].push_back(u); } } rt=1; rt_son=0; memset(cut,false,sizeof(cut)); dfs(rt,1); if (rt_son>1) cut[rt]=true; //有两个子树的根是割点 int sum=0; for (int i=1; i<=n; i++) sum+=cut[i]; printf("%d\n",sum); } return 0;}