http://poj.org/problem?id=1523

这题明显就是求割点然后求割完之后的强连通分量的个数。

割点都会求,怎么求割完的分量个数呢?

我们可以通过万能的并查集啊!(具体做法看代码吧,方法不好叙述)

这样我们查割点它所连的点一共隶属于几个集合即可。

(PS:读入方式很恶心,同时请注意快速读入)

#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
inline int read(){
int x=,w=;char ch=;
while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*w;
}
const int maxn=;
bool dis[maxn][maxn];
bool cut[];
int dfn[maxn];
int low[maxn];
int fa[maxn];
int from[maxn];
int t;
int big[maxn];
int to[maxn];
int find(int a){
if(a==fa[a])return a;
return fa[a]=find(fa[a]);
}
void tarjan(int u,int f){
bool tong[maxn]={};
from[u]=f;
t++;
dfn[u]=t;
low[u]=t;
to[t]=u;
for(int v=;v<=maxn;v++){
if(dis[u][v]){
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
}else if(f!=v){
low[u]=min(low[u],dfn[v]);
}
}
fa[find(u)]=find(to[low[u]]);
}
for(int v=;v<=maxn;v++){
if(dis[u][v]){
if(!tong[find(v)]){
tong[find(v)]=;
big[u]++;
}
}
}
return;
}
int main(){
int u,v;
int cnt=;
bool smg=;
while(){
int u=read();
if(!u&&!smg)break;
smg=;
if(!u){
for(int i=;i<=maxn;i++)fa[i]=i;
tarjan(,);
int rootson=;
bool ok=;
for(int i=;i<=maxn;i++){
int v=from[i];
if(v==)rootson++;
else{
if(low[i]>=dfn[v]&&low[i]&&dfn[i]){
cut[v]=;
ok=;
}
}
}
if(rootson>=){
cut[]=;
ok=;
}
cnt++;
printf("Network #%d\n",cnt);
if(ok==){
printf(" No SPF nodes\n");
}else{
for(int i=;i<=maxn;i++){
if(cut[i])printf(" SPF node %d leaves %d subnets\n",i,big[i]);
}
}
printf("\n");
memset(cut,,sizeof(cut));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(fa,,sizeof(fa));
memset(from,,sizeof(from));
memset(dis,,sizeof(dis));
memset(big,,sizeof(big));
memset(to,,sizeof(to));
t=;
smg=;
continue;
}
int v=read();
dis[u][v]=dis[v][u]=;
}
return ;
}

POJ1523:SPF——题解的更多相关文章

  1. POJ1523 SPF[无向图割点]

    SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8139   Accepted: 3723 Description C ...

  2. POJ1523 SPF 单点故障

    POJ1523 题意很简单,求删除割点后原先割点所在的无向连通图被分成了几个连通部分(原题说prevent at least one pair of available nodes from bein ...

  3. POJ1523 SPF

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8254   Accepted: 3772 Description Consi ...

  4. POJ1523 SPF(割点模板)

    题目求一个无向图的所有割点,并输出删除这些割点后形成几个连通分量.用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边). ...

  5. POJ1523:SPF(无向连通图求割点)

    题目:http://poj.org/problem?id=1523 题目解析: 注意题目输入输入,防止PE,题目就是求割点,并问割点将这个连通图分成了几个子图,算是模版题吧. #include < ...

  6. poj 3614(网络流)

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6672   Accepted: 2348 Descrip ...

  7. poj图论解题报告索引

    最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...

  8. Tarjan求割点和桥

    by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

  9. POJ 1523 SPF 割点与桥的推断算法-Tarjan

    题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,能够得到一棵生成树: 树边:可理解为在DFS过 ...

随机推荐

  1. Java子类与父类之间的类型转换

    1.向上转换 父类的引用变量指向子类变量时,子类对象向父类对象向上转换.从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制. 2.向下转换 在父类变 ...

  2. centos下php环境安装redis

    一.安装redis(仅可在服务器使用,尚不能通过浏览器访问) (1)首先下载redis:wget http://download.redis.io/releases/redis-4.0.9.tar.g ...

  3. 【halcon】学习记录

    图像采集和二值化等处理 * Image Acquisition : Code generated by Image Acquisition open_framegrabber (, , , , , , ...

  4. Python3 下安装python-votesmart

    在python2下安装python-smart还比较容易,而python3中由于很多函数库的变化直接使用python setup.py install 命令来安装的话会导致错误,而导致错误的原因就是p ...

  5. 【主席树维护mex】 【SG函数递推】 Problem H. Cups and Beans 2017.8.11

    Problem H. Cups and Beans 2017.8.11 原题: There are N cups numbered 0 through N − 1. For each i(1 ≤ i ...

  6. 为什么安装beego和框架的失败 以及常用命令

    1.安装了几个版本,版本之间相互影响. 把没用的删掉 2.网上找的教程存在问题. 都是相互抄袭.最权威的还是官网. which go rm -rf test/ echo path 获取路径 vim ~ ...

  7. avalonJS入门

    前端神器avalonJS入门(一) posted @ 2014-10-31 17:44 vajoy 阅读(8759) 评论(42) 编辑 收藏   avalonJS是司徒正美开发和维护的前端mvvm框 ...

  8. Entity Framework 基本概念

    概念 LINQ to Entities 一种 LINQ 技术,使开发人员可以使用 LINQ 表达式和 LINQ 标准查询运算符,针对实体数据模型 (EDM) 对象上下文创建灵活的强类型化查询. ESQ ...

  9. http://www.yiibai.com/javalang/string_endswith.html

    http://www.yiibai.com/javalang/string_endswith.html

  10. su和sudo的使用

    用于用户身份切换 一.su 命令形式 代表内容 su 切换为root,以non-login shell的方式 su - 切换为root,以login shell的方式 su -l 账号 切换为“账号” ...