POJ 1523 网络连通
题目大意:
给你一个网络组,每台机子与其他机子的关系,让你找到所有的割点,如果没有割点,输出无
这道题目就是最直接的求割点问题,我在这里用的是邻接矩阵来存储机子之间的关系
割点问题的求解需要对深度优先搜索序数有比较好的理解
dfn[]用于存储当前的优先搜索序数,low[]存储当前点通过子节点或是回路所能达到的最小优先搜索序数
当(u,v)一组边dfn[u]<=low[v]时,那么u就是一个割点(这是u不作为树的顶点时的情况)
u作为顶点时,也即dfn[u]==1时,要看u的儿子节点数,大于等于2个时也说明它是割点
总体代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1002
#define min(a,b) a<b?a:b;
#define max(a,b) a>b?a:b;
int edge[N][N],low[N],dfn[N],subnets[N],son,visit[N],tmpdfn,n,flag;//flag标志这个图是否能找到割点 void init()
{
memset(visit,,sizeof(visit));
memset(subnets,,sizeof(subnets));
visit[]=,low[]=,dfn[]=,son=,tmpdfn=;
}
void dfs(int u)//dfs函数要进行递归,所以不在里面进行初始化操作
{
for(int i=;i<=n;i++){
if(edge[u][i]){
if(!visit[i]){
tmpdfn++;
visit[i]=;
low[i]=dfn[i]=tmpdfn;
dfs(i);
low[u]=min(low[u],low[i]);//回退的时候,找祖先节点u能达到的较小的low值
if(low[i]>=dfn[u]){
if(u!=) subnets[u]++;
else son++;
}
}
else low[u]=min(low[u],dfn[i]);//这时候i是u的祖先节点,且这是一条回边
}
}
}
int main()
{
int u,v,cnt=;
while(scanf("%d",&u)&&u!=){
flag=,n=;
cnt++;//来统计网络个数
scanf("%d",&v);
n=max(n,u);
n=max(n,v);
memset(edge,,sizeof(edge));
edge[u][v]=,edge[v][u]=;
while(scanf("%d",&u)&&u!=){
scanf("%d",&v);
n=max(n,u);
n=max(n,v);
edge[u][v]=,edge[v][u]=;
}
printf("Network #%d\n",cnt);
init();
dfs();
if(son>) subnets[]=son-;
for(int i=;i<=n;i++){
if(subnets[i]){
flag=;
printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+);
}
}
if(flag==) printf(" No SPF nodes\n");
printf("\n");
}
return ;
}
POJ 1523 网络连通的更多相关文章
- 判断是否网络连通 .net Ping
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...
- Dockers(29)- 网络连通
网络连通 背景 基于docker0建了两个容器tomcat01和tomcat02,网段位于172.12.0.0/16 我们又新建了一个网络,网段为192.168.0.0/16,基于此网段新建了两个容器 ...
- poj 1523 SPF【点双连通求去掉割点后bcc个数】
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7246 Accepted: 3302 Description C ...
- poj 1523 SPF(双连通分量割点模板)
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...
- POJ 1523 (割点+连通分量)
题目链接:http://poj.org/problem?id=1523 题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数. 解题思路: POJ的数据很弱. Tarjan法求割点. ...
- POJ 1523 SPF (割点,连通分量)
题意:给出一个网络(不一定连通),求所有的割点,以及割点可以切分出多少个连通分量. 思路:很多种情况. (1)如果给的图已经不是连通图,直接“ No SPF nodes”. (2)求所有割点应该不难 ...
- zoj 1119 /poj 1523 SPF
题目描述:考虑图8.9中的两个网络,假定网络中的数据只在有线路直接连接的2个结点之间以点对点的方式传输.一个结点出现故障,比如图(a)所示的网络中结点3出现故障,将会阻止其他某些结点之间的通信.结点1 ...
- POJ 1523 SPF 割点与桥的推断算法-Tarjan
题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,能够得到一棵生成树: 树边:可理解为在DFS过 ...
随机推荐
- Dapper系列之二:Dapper的事务查询
Dapepr讲解 上篇文章我们介绍了,什么是Dapepr,有什么好处,性能的对比,还有多表多数据添加操作(事务的封装)等等.本篇文章我们继续讲解.....如果本篇文章看不懂,请看我上一篇文章:Dape ...
- 拦截@RequestBody的请求数据
要拦截首先想到的是拦截器,@RequestBody只能以流的方式读取,流被读过一次后,就不在存在了,会导致会续无法处理,因此不能直接读流 为了解决这个问题,思路如下: 1.读取流前先把流保存一下 2. ...
- 23中java设计模式(1)-- 策略模式
近来不太忙,就打算抽空看下源码补充一下知识,当我看了之后我发现看源码的关键是要弄清楚类之家的关系以及为何要这样的关系,否则如果只看具体的代码那不如去学习会儿算法. 于是就打算从设计模式入手,边学习边记 ...
- logback日志异步打印
最近碰到一个问题:客户的服务器程序偶尔出现请求响应过慢的情况,通过查看日志发现RSA验证签名的代码执行超过20秒,而正常情况下只需要16毫秒. RSA证书是服务器启动就加载好的,不存在读文件慢的问题. ...
- hdu1513 Palindrome
思路: dp+滚动数组. 实现: #include <iostream> #include <cstdio> #include <string> #include ...
- iOS 网络开发
http://www.cnblogs.com/kenshincui/p/4042190.html
- 程序员必须知道FTP命令
程序员必须知道FTP命令 文件传输软件的使用格式为:FTP<FTP地址>,若连 接成功,系统将提示用户输入 ...
- SQLite-Like语句
SQLite – LIKE子句 使用SQLite LIKE运算符 用于匹配文本.如果搜索表达式可以匹配模式表达式,如操作符将返回true,这是1.有两个通配符与Like操作符一起使用: The per ...
- 前端什么是BFC
什么是BFC? 全称块级格式化上下文?什么意思不懂.看了好多博客,基本都是抄的,真心都不是大白话.我今天来总结一下,用菜鸟级别的语言来描述. BFC 应该可以抽象成一个 独立的个体,出淤泥而不染的白莲 ...
- exit - 使程序正常中止
SYNOPSIS 总览 #include <stdlib.h> void exit(int status); DESCRIPTION 描述 函数 exit() 使得程序正常中止,statu ...