题目链接

题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量。

思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边。

 //poj1523
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std ; int edge[][],dfn[],low[],subnet[] ;
int tot,Node ,son; void dfs(int u)
{
dfn[u] = low[u] = ++tot ;
for(int v = ; v <= Node ; v++)
{
if(edge[u][v])
{
if(!dfn[v])
{
dfs(v) ;
low[u] = min(low[v],low[u]) ;
if(low[v] >= dfn[u])
{
if(u != )//非根节点
subnet[u] ++ ;
else son ++ ;
}
}
else
{
low[u] = min(low[u],dfn[v]) ;
}
}
}
} void Init()
{
tot = son = Node = ;
memset(dfn,,sizeof(dfn)) ;
memset(low,,sizeof(low)) ;
memset(subnet,,sizeof(subnet)) ;
memset(edge,,sizeof(edge)) ;
}
int main()
{
int m,n ;
int casee = ;
while(scanf("%d",&m) && m)
{
scanf("%d",&n) ;
Init() ;
Node = max(m,max(n,Node)) ;
edge[m][n] = edge[n][m] = ;
while(~scanf("%d",&m) && m)
{
scanf("%d",&n) ;
Node = max(m,max(n,Node)) ;
edge[m][n] = edge[n][m] = ;
}
// if(casee > 1)
// puts("") ;
printf("Network #%d\n",casee ++) ;
dfs() ;
if(son > )
subnet[] = son - ;
int flag = ;
for(int i = ; i <= Node ; i++){
if(subnet[i])
{
flag = ;
printf(" SPF node %d leaves %d subnets\n",i,subnet[i]+) ;
}
}
if(!flag)
puts(" No SPF nodes") ;
puts("") ;
}
return ;
}

最新文章

  1. Python模拟HttpRequest的方法总结
  2. Jackson的使用
  3. C++语言-08-命名空间
  4. 谈谈final、finally、finalize的区别
  5. POJ 3368 RMQ-ST
  6. 键盘码、ASCII码表
  7. Python学习入门基础教程(learning Python)--6.3 Python的list切片高级
  8. Android 增量更新
  9. Mac上编译并运行Android5.0源码
  10. MYSQL 更新时间自动同步与创建时间默认值共存问题
  11. Xshell访问和连接Linux
  12. 20155205 郝博雅 Exp3 免杀原理与实践
  13. C++拷贝构造函数(深拷贝&amp;浅拷贝)
  14. 【C++ Primer 第13章】2. 拷贝控制和资源管理
  15. python学习之路05
  16. python网页爬虫开发之二
  17. .gitignore文件常用写法
  18. 20145330 《网络对抗》逆向及BOF基础实践
  19. 尝试优化骨骼动画计算的意外收获——使用嵌入式汇编对float转int进行优化
  20. HTTP 499状态码 nginx下499错误详解-乾颐堂

热门文章

  1. 在Linux上安装JDK7
  2. hdu 1548 A strange lift
  3. ubuntu server获取并自动设置最快镜像的方法
  4. 从烙铁手到IT男
  5. 49.关于Quartus和ISE中ROM的初始化和仿真的一些小结
  6. C++设计模式——享元模式
  7. powerdesigner 技巧
  8. c判断括弧是否匹配
  9. Android -- Webview自适应屏幕
  10. 20145120 《Java程序设计》实验二实验报告