【 C - Network 】 【  POJ - 1144 】【【基础班之强连通、桥、割顶专题训练】】

传送门 

因为 Vjudge 上 排名榜 已经 End (还是太菜了,(╥╯^╰╥)),然后 了也不给 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值