POJ1523 SPF 单点故障
题意很简单,求删除割点后原先割点所在的无向连通图被分成了几个连通部分(原题说prevent at least one pair of available nodes from being able to communicate on what was previously a fully connected network,阻止至少一对可用节点能够在先前完全连接的网络上进行通信,所以输入的图不保证连通)
对于每个割点
- 如果它是根节点,则答案=DFS树的子树数量
- 如果它是非根节点,则答案=孩子low值>=当前结点的dfn值的孩子数
注意要扫描所有的点从未访问的点开始DFS!
还有多组数据记得清空数组!
代码如下(我绝对不会告诉你们我因为写错了输出格式而调了一上午)
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
#define re register int
struct edge
{
int to,pre;
}edges[];//邻接表
int head[],tot,dfn[],dfs_clock;
int ans[];//删去结点i后连通分量的个数
int read()
{
int f=,x=;
char c=getchar();
while(!isdigit(c))
{
f=f|c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return x;
}
void add(int x,int y)
{
edges[++tot].to=y;
edges[tot].pre=head[x];
head[x]=tot;
}
int tarjan(int u,int fa)
{
int lowu=dfn[u]=++dfs_clock,child=;
ans[u]=;
for(re i=head[u];i;i=edges[i].pre)
if(!dfn[edges[i].to])
{
child++;
int lowv=tarjan(edges[i].to,u);
lowu=min(lowu,lowv);
if(lowv>=dfn[u])//有一个孩子满足,连通分量+1
ans[u]++;
}
else if(edges[i].to!=fa)
lowu=min(lowu,dfn[edges[i].to]);
if(u==fa)//根节点删去后连通分量数=子树个数
ans[u]=child;
return lowu;
}
int main()
{
int t=,x,y;
while(x=read())
{
memset(edges+,,<<),memset(head+,,<<),memset(dfn+,,<<);
tot=dfs_clock=;
t++;
y=read();
int n=max(x,y);
add(x,y),add(y,x);
while(x=read())
{
y=read();
n=max(max(x,y),n);
add(x,y),add(y,x);
}
tarjan(,);
printf("Network #%d\n",t);
int pd=;
for(re i=;i<=n;i++)
if(ans[i]>)
{
pd=;
printf(" SPF node %d leaves %d subnets\n",i,ans[i]);
}
if(!pd)
printf(" No SPF nodes\n");
printf("\n");
}
return ;
}
SPF 单点故障
POJ1523 SPF 单点故障的更多相关文章
- POJ1523 SPF[无向图割点]
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8139 Accepted: 3723 Description C ...
- POJ1523 SPF
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8254 Accepted: 3772 Description Consi ...
- POJ1523 SPF(割点模板)
题目求一个无向图的所有割点,并输出删除这些割点后形成几个连通分量.用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边). ...
- POJ1523:SPF(无向连通图求割点)
题目:http://poj.org/problem?id=1523 题目解析: 注意题目输入输入,防止PE,题目就是求割点,并问割点将这个连通图分成了几个子图,算是模版题吧. #include < ...
- poj图论解题报告索引
最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...
- Tarjan求割点和桥
by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...
- POJ1523:SPF——题解
http://poj.org/problem?id=1523 这题明显就是求割点然后求割完之后的强连通分量的个数. 割点都会求,怎么求割完的分量个数呢? 我们可以通过万能的并查集啊!(具体做法看代码吧 ...
- POJ 1523 SPF(求割点)
题目链接 题意 : 找出图中所有的割点,然后输出删掉他们之后还剩多少个连通分量. 思路 : v与u邻接,要么v是u的孩子,要么u是v的祖先,(u,v)构成一条回边. //poj1523 #includ ...
- POJ 1523 SPF 割点与桥的推断算法-Tarjan
题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,能够得到一棵生成树: 树边:可理解为在DFS过 ...
随机推荐
- prism Callback应用
Mock<IEventAggregator> mockEventAggregator; Mock<MyEvent> mockEvent; mockEventAggregator ...
- Linux mysql ERROR 1045 解决
Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ...
- Java与C#不同
1.C#方法定义可以有默认参数,而Java则不支持该方式. C#方法定义 public void ShowMessage(string text,string orderId="" ...
- TCP网络编程(Socket通讯)
TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...
- 【Linux开发】Ubuntu下几个软件的配置记录backup
调用ubuntu命令行的方法:ctrl+alt+t gcc -o test test.c 开发工具包括eclipse,Qt等全部放入了/opt/路径下,java开发环境放在了/usr/local/jd ...
- 最全的DevOps自动化工具集合
版本控制&协作开发:GitHub.GitLab.BitBucket.SubVersion.Coding.Bazaar 自动化构建和测试:Apache Ant.Maven .Selenium.P ...
- ubutu16.04编译安装apache
// 安装编译器 sudo apt-get install build-essential // 下载所需依赖及apache2源码包 wget --no-check-certificate https ...
- 【JZOJ 3909】Idiot 的乘幂
题面: 正文: 把题目中的方程组组合在一起就变成了: \(X^{a+c}\equiv b \cdot d (\mod p)\) 那这时,我们假定两个数\(x\)和\(y\),使得: \(ax + cy ...
- mac下安装php zookeeper扩展
安装步骤 php-zookeeper依赖libzookeeper,所以需要先安装libzookeeper 安装libzookeeper cd /usr/local/src/ wget http://m ...
- Python入门之 Python内置函数
Python入门之 Python内置函数 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用 ...