poj1144 求割點 模版題
阿新 • • 發佈:2019-01-09
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<string.h> using namespace std; const int Max=111; int low[Max],dfn[Max]; int cnt[Max]; vector<int>Gra[Max]; int n,m,sons; int MIN(int a,int b) { return a>b?b:a; } void dfs(int pox,int dep) { dfn[pox]=low[pox]=dep; for(int i=0; i<Gra[pox].size(); i++) { int v=Gra[pox][i]; if(!dfn[v]) { dfs(v,dep+1); if(pox==1) sons++; else { low[pox]=MIN(low[pox],low[v]); if(low[v]>=dfn[pox]) cnt[pox]=1; } } else low[pox]=MIN(low[pox],dfn[v]); } } int main() { int u,v; int ans; while(scanf("%d",&n),n) { sons=ans=0; for(int i=1; i<Max; i++) Gra[i].clear(); memset(cnt,0,sizeof(cnt)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); while(scanf("%d",&u),u) { while(getchar()!='\n') { scanf("%d",&v); Gra[u].push_back(v); Gra[v].push_back(u); } } dfs(1,1); if(sons>1) cnt[1]=1; for(int i=1; i<=n; i++) ans+=cnt[i]; printf("%d\n",ans); } return 0; }