题意:求割顶个数,模板题不解释
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>
#include<vector>
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
#define N 105
using namespace std;
char s[10000];
vector<int> G[N];
int pre[N],iscut[N],low[N];
int dfs_clock;
int dfs(int u,int fa)
{
int lowu = pre[u] = ++dfs_clock;
int child = 0,len = G[u].size();
for(int i = 0; i < len; 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] = 1;//如果是u是割点则标记为1
}
else if(pre[v] < pre[u] && v != fa)
lowu = min(lowu,pre[v]);
}
if(fa < 0 && child == 1) iscut[u] = 0;
low[u] = lowu;//可以不用low数组
return lowu;
}
int main()
{
int n;
while(scanf("%d",&n) && n)
{
getchar();
int i;
for(i = 0; i <= n; i++)
G[i].clear();
int u,v;
while(scanf("%d",&u),u)//注意输入问题
{
while (getchar()!='\n')
{
scanf("%d",&v);
G[u].push_back(v);
G[v].push_back(u);
}
}
dfs_clock = 0;
memset(iscut,0,sizeof(iscut));
memset(pre,0,sizeof(pre));
dfs(1,-1);
int cnt = 0;
for(i = 1; i <= n; i++)
if(iscut[i] == 1)
cnt++;
printf("%d\n",cnt);
}
return 0;
}