因为 Vjudge 上 排名榜 已经 End (还是太菜了,(╥╯^╰╥)),然后 A 了也不给 Solved(委屈脸),只好自己发一波 AC
题目中 说 求 关键点 个数,关键点 定义为 自己 WA 了之后(断开连接)会影响其他点的联通性。
模板题,求割点的个数。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
inline int wread(){
char c(getchar()); int wans(0),flag(1);
while (c<'0' || c>'9'){if (c=='-') flag=-1; c=getchar ();}
while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar();}
return wans*=flag;
}
int n;
int K,hed[1005];
struct node{int v,nxt;}e[200000];
void ad (int u,int v){e[++K].v=v;e[K].nxt=hed[u];hed[u]=K;}
int dfn[1005],low[1005],cnt,num,root;
void Tarjan_dian (int x,int fa){
int chld(0);
dfn[x]=low[x]=++cnt;
for (int i(hed[x]);i!=-1;i=e[i].nxt){
int v(e[i].v);
if (!dfn[v]){
Tarjan_dian (v,x);
low[x]=min (low[x], low[v]);
if (dfn[x]<=low[v]){
chld++;
}
}
else if (v!=fa) low[x]=min (low[x],dfn[v]);
}
if (x==root && chld>=2 || x!=root && chld>=1) num++;
//没有写简化版,想自己记住定义啦~就没写 (而且我是写在for循环外面的)
}
int main (){
while (scanf ("%d",&n) && n){
cnt=num=K=0;
memset (dfn,0,sizeof dfn);
memset (low,0,sizeof low);
memset (hed,-1,sizeof hed);
int u;
while (scanf ("%d",&u) && u){
while (getchar() !='\n'){
int v;
scanf ("%d",&v);
ad(u,v); ad(v,u);
}
}
root=1;
Tarjan_dian(1,1);
printf ("%d\n",num);
}
return 0;
}