POJ 1144 Network(无向图的割顶和桥模板题)

时间:2023-03-09 00:38:58
POJ 1144 Network(无向图的割顶和桥模板题)

http://poj.org/problem?id=1144

题意:

给出图,求割点数。

思路:

关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.****.net/stillxjy/article/details/70176689

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std; const int maxn=+; int n;
vector<int> G[maxn];
int pre[maxn],low[maxn];
int iscut[maxn];
int dfs_clock; int dfs(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
int child=;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(!pre[v])
{
child++;
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(lowv>=pre[u]) iscut[u]=true;
}
else if(pre[v]<pre[u] && v!=fa)
lowu=min(lowu,pre[v]);
}
if(fa<&&child==) iscut[u]=;
low[u]=lowu;
return lowu;
} int get_int(char s[])
{
int m=;
for(int i=;s[i];i++)
m=m*+s[i]-'';
return m;
} int main()
{
//freopen("D:\\input.txt","r",stdin);
while(~scanf("%d",&n) && n)
{
for(int i=;i<=n;i++) G[i].clear();
memset(pre,,sizeof(pre));
memset(low,,sizeof(low));
memset(iscut,,sizeof(iscut));
dfs_clock=; char s[];
while(scanf("%s",&s))
{
if(s[]=='') break;
int u=get_int(s);
while(scanf("%s",&s))
{
int v=get_int(s);
G[u].push_back(v);
G[v].push_back(u);
if(getchar()=='\n') break;
}
}
int ans=;
dfs(,-);
for(int i=;i<=n;i++)
if(iscut[i]) ans++;
printf("%d\n",ans);
}
return ;
}