解析:
题意:求割点数目:
用tarjan求图的的割点模板题,注意输入有点麻烦。
AC Code
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100 + 10;
int n;
bool mp[maxn][maxn];
int dfn[maxn];
int low[maxn];
bool vis[maxn];
int index = 1;
int root;
//编号
void tarjan(int u)
{
dfn[u] = low[u] = index++;
for(int v = 1; v <= n; v++)
{
if(mp[u][v])
{
if(dfn[v] == -1)
{
tarjan(v);
low[u] = min(low[u],low[v]);
if(low[v] >= dfn[u] && u != 1) vis[u] = true;
else if (u == 1) root++;
}
else low[u] = min(low[u],dfn[v]);
}
}
}
void solve()
{
memset(dfn,-1,sizeof(dfn));
memset(vis,false,sizeof(vis));
index = 1; root = 0;
tarjan(1);
int ans = 0;
if(root > 1) ans++;
for(int i = 1; i <= n; i++)
if(vis[i]) ans++;
printf("%d\n",ans);
}
int main()
{
while(scanf("%d",&n) && n)
{
int u,v;
memset(mp,false,sizeof(mp));
while(scanf("%d",&u) && u)
while(getchar() != '\n')
{
scanf("%d",&v);
mp[u][v] = mp[v][u] = true;
}
solve();
}
return 0;
}