poj1144(求图中割点的个数)

来源:互联网 发布:矩阵迹的性质及证明 编辑:程序博客网 时间:2024/06/06 00:52

求图中割点的个数


#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;const int N=109;int low[N],dfn[N],id,ans,n;bool vis[N];vector<int> g[N];void dfs(int u){low[u]=dfn[u]=++id;int ch=0;//孩子数目for (int i=0;i<g[u].size();i++){int v=g[u][i];if (!dfn[v])//确保子树不相连{dfs(v);ch++;if (low[v]>=dfn[u]&&u!=1) vis[u]=true;//标记是割点low[u]=min(low[v],low[u]); }else low[u]=min(low[u],dfn[v]);}if (u==1&&ch>=2) vis[1]=true;//如果是根节点,必须有两个以上不相连的子树才行}int main(){while (scanf("%d",&n)!=-1){if (n==0)break;memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));id=0;for (int i=0;i<=n;i++) g[i].clear();int a,b;while (scanf("%d",&a)&&a)while (getchar()!='\n') {scanf("%d",&b);g[a].push_back(b);g[b].push_back(a);}memset(vis,false,sizeof(vis));ans=0;dfs(1);for (int i=1;i<=n;i++) ans+=vis[i];printf("%d\n",ans);}}


0 0
原创粉丝点击