博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1144 Network 连通性
阅读量:5103 次
发布时间:2019-06-13

本文共 1462 字,大约阅读时间需要 4 分钟。

题意:求图中割点的数量,割点是指无向图中的一个点,满足删除与该点所连的边后原图中曾经相通的点不再连通。

题解:回忆Tarjan求SCC的过程,如果某个点u的某个儿子v及其子树中的所有点的low均大于等于dfn[u](即low[v]<=dfn[u]),那么v子树上的点只能通过u来到达其他节点,因此u是一个割点。同理如果low[v]>dfn[n],则v子树上的点只能通过(u,v)来到达其他节点,因此(u,v)是一条割边。

#include 
#include
#include
#include
#include
#include
using namespace std;const int MAXN=100+2;const int MAXM=10000+2;struct HASH{ int u; HASH *next; HASH(){} HASH(int _u,HASH *_next):u(_u),next(_next){}}*table[MAXN],mem[2*MAXM];int N,cnt,ans;int dfn[MAXN],low[MAXN],depth,t;bool flag[MAXN],cut[MAXN];void Insert(int u,int v){ table[u]=&(mem[cnt++]=HASH(v,table[u]));}void Tarjan(int x){ dfn[x]=low[x]=++depth,flag[x]=1; for(HASH *p=table[x];p;p=p->next){ if(!dfn[p->u]){ Tarjan(p->u),low[x]=min(low[x],low[p->u]); if(low[p->u]>=dfn[x] && x!=1) cut[x]=1; else if(x==1) t++;//if(low[p->u]>dfn[x]) bridge++; } else low[x]=min(low[x],dfn[p->u]); }}int main(){ while(scanf("%d",&N)!=EOF && N){ t=ans=cnt=depth=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(cut,0,sizeof(cut)); memset(flag,0,sizeof(flag)); memset(table,0,sizeof(table)); int u,v; while(scanf("%d",&u) && u) while(getchar()!='\n'){ scanf("%d",&v); Insert(u,v),Insert(v,u); } Tarjan(1); for(int i=1;i<=N;i++) if(cut[i]) ans++; if(t>1) ans++; printf("%d\n",ans); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6477067.html

你可能感兴趣的文章
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
php_扑克类
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>