POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数。
注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一下讨论:
如果这个割点是根节点,在tarjan算法中搜到几个孩子结点(low[v] >= dfn[u]),他就能割出几个联通块,如果这个割点是孩子结点,那么他所形成的联通块的个数+1,因为他还有一条与父亲结点间接或直接相连的边。
代码如下:
#include<map>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 1010
struct EDGE
{
int to,nxt;
} edge[maxn*];
int head[maxn],low[maxn],dfn[maxn],mark[maxn],vis[maxn];
int tot,all,son,start,tail;
void add_edge(int u,int v)
{
edge[tot].to = v;
edge[tot].nxt = head[u];
head[u] = tot++;
}
void init()
{
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(mark,,sizeof(mark));
all = ;
son = ;
}
void tarjan(int u,int fa)
{
dfn[u] = low[u] = ++all;
for(int i = head[u]; i != -; i = edge[i].nxt)
{
int v = edge[i].to;
if(!dfn[v])
{
tarjan(v,u);
low[u] = min(low[v],low[u]);
if(low[v] >= dfn[u])
{
if(u == start) son++;
else mark[u] = ;
}
}
else if(v != fa) low[u] = min(low[u],dfn[v]);
}
return ;
}
void bfs(int x,int cant)
{
queue<int>que;
while(!que.empty()) que.pop();
que.push(x);
vis[x] = ;
while(!que.empty())
{
int num = que.front();
que.pop();
for(int i = head[num]; i != -; i = edge[i].nxt)
{
int v = edge[i].to;
if(v != cant && !vis[v])
{
que.push(v);
vis[v] = ;
}
}
}
return ;
}
int main()
{
int a,b;
int ca = ;
while(~scanf("%d",&a))
{
if(!a) break;
start = ,tail = ;
scanf("%d",&b);
start = min(a,b);
tail = max(a,b);
tot = ;
memset(head,-,sizeof(head));
add_edge(a,b);
add_edge(b,a);
while(~scanf("%d",&a))
{
if(!a) break;
scanf("%d",&b);
add_edge(a,b);
add_edge(b,a);
start = min(min(a,b),start);
tail = max(max(a,b),tail);
}
init();
tarjan(start,-);
if(son >= ) mark[start] = ;
int subnets = ,spf = ;
printf("Network #%d\n",++ca);
bool flag = true;
for(int i = start; i <= tail; i++)
{
if(mark[i])
{
flag = false;
printf(" SPF node %d leaves ",i);
memset(vis,,sizeof(vis));
subnets = ;
for(int j = start;j <= tail;j++)
{
if(j == i) continue;
if(!vis[j])
{
subnets++;
bfs(j,i);
}
}
printf("%d subnets\n",subnets);
}
}
if(flag) puts(" No SPF nodes");
puts("");
}
return ;
}
POJ 1523 SPF (去掉割点能形成联通块的个数)的更多相关文章
- poj 1523 SPF 求割点以及删除该割点后联通块的数量
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7136 Accepted: 3255 Description C ...
- POJ 1523 SPF 求割点的好(板子)题!
题意: 给个无向图,问有多少个割点,对于每个割点求删除这个点之后会产生多少新的点双联通分量 题还是很果的 怎么求割点请参考tarjan无向图 关于能产生几个新的双联通分量,对于每个节点u来说,我们判断 ...
- POJ 1523 SPF (无向图割点)
<题目链接> 题目大意: 给你一个连通的无向图,问你其中割点的编号,并且输出删除该割点后,原图会被分成几个连通分量. 解题分析: Tarjan求割点模板题. #include <cs ...
- C. Learning Languages 求联通块的个数
C. Learning Languages 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...
- zoj 1119 / poj 1523 SPF (典型例题 求割点 Tarjan 算法)
poj : http://poj.org/problem?id=1523 如果无向图中一个点 u 为割点 则u 或者是具有两个及以上子女的深度优先生成树的根,或者虽然不是一个根,但是它有一个子女 w, ...
- POJ 1523 SPF 割点 Tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9317 Accepted: 4218 Description C ...
- 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 SPF(割点)
http://poj.org/problem?id=1523 太弱... too weak.. 割点我都还要看书和看题解来写..果然是写不出么.. 割点就那样求,然后分量直接这个节点有多少子树就有子树 ...
随机推荐
- 使 httpClient 支持中文
一个有效的方法:重载 PostMethod 的 getRequestCharSet 方法 1: class PostChinese { 2: HttpClient httpClient = new H ...
- DOS 命令批量删除文件及相关批处理命令详解
del X:\*.* /f /s /q /a 递归强制静默删除X盘及其所有子目录下的所有文件 /f 表示强制删除文件 /s表示子目录都要删除该文件 /q表示无声,不提示 /a根据属性选择要删除的文件 ...
- 【Linux】给Linux配置SNMP用户以及协议
1 检查是否已经安装snmp的rpm包Ideploy:~ # rpm -aq | grep snmp libsnmp15-5.4.2.1-8.12.10.1 snmp-mibs-5.4.2.1-8.1 ...
- 当用反射获取一个model,这个model里面字段有nullable的时候,获取字段真实类型
Using Reflection to Determine whether an Type is Nullable And Get the underlying Type /// <summar ...
- Flask -- 路由
route()装饰器把一个函数绑定到对应的URL(可以是多个)上 @app.route('/') def index(): return 'Index Page' @app.route('/hello ...
- Sublime 3 and Python
1. 安装Anaconda插件 Ctrl+Shift+P打开控制面板,找到Install Package,回车 在弹出框中输入Anaconda,回车安装即可. 2.配置Anaconda文件 Prefe ...
- 命令窗口修改编码,CMD编码修改方法
cmd中的编码方式为ANSI,若中文不是此编码方式则会出现乱码.作为程序员,会经常使用命令窗口查看执行日志,但是有时编码格式不对,大部分都是UTF8,在网上搜索了不少方法,很多没什么用,在这里教一个具 ...
- RF常用技巧随笔
合并xml输出文件: pybot --outputdir d:\test --log log1.html --report report1.html --output output1.xml -T d ...
- Chapter 2 Open Book——13
"People in this town," he muttered. "Dr. Cullen is a brilliant surgeon who could prob ...
- DOM操作-遍历HTML文档内容
基础: JS nodeType返回类型:http://blog.csdn.net/qyf_5445/article/details/9232907 代码: <!DOCTYPE html> ...