题目链接:

POJ1523

题意:

问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分

题解:

Tarjan 算法模板题

顺序遍历整个图,能够得到一棵生成树:

树边:可理解为在DFS过程中訪问未訪问节点时所经过的边。也称为父子边

回边:可理解为在DFS过程中遇到已訪问节点时所经过的边。也称为返祖边、后向边

对根节点u,若其有两棵或两棵以上的子树。则该根结点u为割点。

对非叶子节点u(非根节点)。若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。

// 当(u,v)为树边且low[v]>dfn[u]时,表示v节点仅仅能通过该边(u,v)与u连通,那么(u,v)即为割边。

用一个数组保存每一个节点的子树个数就可以

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 1050
using namespace std;
int dfn[maxn],low[maxn];          //dfs序  和子树连接的最小节点
int vis[maxn];
vector<int>edge[maxn];
int child[maxn];
int num,son;
void init()
{memset(vis,0,sizeof(vis));memset(child,0,sizeof(child));vis[1]=1;num=0;son=0;
}
void Tarjan(int u)
{dfn[u]=low[u]=++num;vis[u]=1;for(int i=0; i<edge[u].size(); i++){int v=edge[u][i];if(!vis[v]){Tarjan(v);low[u]=min(low[u],low[v]);if(dfn[u]<=low[v])       //得到子树{if(u!=1)child[u]++;elseson++;}}else low[u]=min(low[u],dfn[v]);}
}
int main()
{
//    freopen("in.txt","r",stdin);int a,b;int Case=1;while(1){while(scanf("%d",&a)&&a){scanf("%d",&b);edge[a].push_back(b);edge[b].push_back(a);}init();Tarjan(1);
//        for(int i=1;i<=5;i++)
//        cout<<dfn[i]<<" "<<low[i]<<endl;if(Case>1)cout<<endl;printf("Network #%d\n",Case++);int flag=1;child[1]=son-1;for(int i=1; i<=1000; i++)if(child[i]>0){flag=0;printf("  SPF node %d leaves %d subnets\n",i,child[i]+1);}if(flag)cout<<"  No SPF nodes"<<endl;for(int i=1; i<=1000; i++)edge[i].clear();scanf("%d",&a);if(a==0)break;scanf("%d",&b);edge[a].push_back(b);edge[b].push_back(a);}return 0;
}

转载于:https://www.cnblogs.com/liguangsunls/p/6714371.html

POJ 1523 SPF 割点与桥的推断算法-Tarjan相关推荐

  1. POJ 1523 SPF (割点 点双连通分量)

    题意:求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块)) [求割点]对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号.定义Low(u)为u或u的子树 ...

  2. poj 1523 SPF (无向图 的 割点)

    http://poj.org/problem?id=1523 题意:  求  无向图的 个点,以及 将个点 去掉后  图 被分成 几个联通块: 题解:  tarjan   .   1 #include ...

  3. POJ 1523 SPF

    大意:求割顶的数量以及删除割顶之后子图的数量. 思路:Tarjan算法求割顶,同POJ 1144 NetWork. CODE1: #include<cstdio> #include< ...

  4. 第1节 连通性强连通、割点和桥(一)

    文章目录 无向图割点.桥.双连通分量 Tarjan算法求割点和桥(割边) 代码: 边双连通分量 和 点双连通分量 代码 边双连通分量 和 点双连通分量 的缩点 有向图的弱连通与强连通 强连通分量 Ko ...

  5. 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会

    先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...

  6. 一本通-提高篇-图论-割点和桥:

    一本通: 提高篇: 图论: 割点和桥: 1520:[ 例 1]分离的路径 题意:如何把有桥图通过加边变成边双连通分量 如果叶子数(缩点后度为1的点)为1,则至少需要添加0条边: 否则为(叶子数+1)/ ...

  7. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB 提交: 475  解决: 34 提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如 ...

  8. 图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  9. [转载]图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

最新文章

  1. 编写高效的C程序与C代码优化
  2. 使对易失性字段的操作原子化
  3. ServiceMesh最火项目:Istio架构解析
  4. Java @SafeVarargs注解
  5. 这个事关中国人幸福感的问题,能解决吗?
  6. 推荐一款强大的SQL Internal 查看工具InternalsViewer
  7. 称重传感器并联后的误差及附加误差
  8. 系统科学论(新三论、老三论)漫谈
  9. 引入网易云音乐播放器卡片
  10. 大文件编辑查看工具推荐:ultraedit、logviewer。文件太大notepad++等编辑工具无法打开解决办法
  11. 多媒体信息发布系统源码
  12. Cisco路由器的命令配置教程详解
  13. 【C51】单片机芯片之——图解74HC595
  14. linux 2t gpt 分区,linux大于2T的磁盘使用GPT分区方式
  15. Linux Opencv+zBar二维码识别
  16. linux查看wifi信号命令_linux无线网络命令
  17. jeremiah(jeremiah wright简介)
  18. Springboot使用s7connector 实现对西门子PLC数据读写
  19. 大创项目学习日志(二)——汉字转拼音软件的选择与尝试
  20. 宇称(空间反演对称性)算符应用

热门文章

  1. 刚安装的python如何使用-Anaconda介绍、安装及使用教程
  2. python手机版ios-iOS 项目中如何使用 Python
  3. python处理表格数据-用Python创建/读取/导出表格数据文件
  4. python从入门到精通怎么样-Python 从入门到精通:一个月就够了
  5. python处理表格数据-Python数据处理(二):处理 Excel 数据
  6. 基于python的界面自动化测试-基于Python语言的自动化测试系统的设计与实现
  7. python简单代码加法-Python tkinter实现简单加法计算器代码实例
  8. python自学免费课堂-如何系统地自学 Python?
  9. python和c哪个好学-c语言和python哪个容易
  10. 怎么用python处理excel文件-python如何处理excel