UVA 351 Network 无向图求割点

来源:互联网 发布:易语言写软件 编辑:程序博客网 时间:2024/09/21 06:35
裸的无向图求割点。自己的第一个求割点题目
#include<iostream>#include<algorithm>#include<cstring>#include<queue>#define ll long long#define ld long double#define INF 0x3f3f3f3fusing namespace std;vector<int> G[102];int dfn[102],low[102],f[102],Now;bool cut[102];void mem() {for(int i=0; i<102; i++)G[i].clear();memset(dfn,0,sizeof dfn);memset(low,0,sizeof low);memset(f,0,sizeof f);memset(cut,0,sizeof cut);Now=1;}void Tarjan(int x,int fa) {dfn[x]=low[x]=Now++;f[x]=fa;for(int i=0; i<G[x].size(); i++) {if(!dfn[G[x][i]]) {Tarjan(G[x][i],x);low[x]=min(low[x],low[G[x][i]]);} else {if(G[x][i]!=fa)low[x]=min(low[x],dfn[G[x][i]]);}}}int main() {//std::ios::sync_with_stdio(false);// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int n;while(cin>>n&&n) {mem();int a;while(cin>>a&&a) {int x;char c;while(scanf("%d%c",&x,&c)) {G[a].push_back(x);G[x].push_back(a);if(c=='\n')break;}}Tarjan(1,1);                     //求dfn和low,因为是无向图,带着父节点 int fa=0,ans=0;for(int i=2; i<=n; i++) {if(f[i]==1)                  //求根节点的子树个数 fa++;else if(low[i]>=dfn[f[i]])   //如果没有回溯到父节点以前,说明父节点是割点 cut[f[i]]=1;}for(int i=2; i<=n; i++)if(cut[i])ans++;if(fa>=2)ans++;cout<<ans<<endl;}return 0;}