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. /proc/meminfo详解

    cat /proc/meminfo   读出的内核信息进行解释, 下篇文章会简单对读出该信息的代码进行简单的分析. MemTotal:       507480 kB MemFree:         ...

  2. 180623-SpringBoot之logback配置文件

    SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在S ...

  3. 敏捷开发学习笔记-Agile development(AM)

    以人为核心,迭代,循序渐进 项目被切分为多个子项目,每个子项目都经过测试,具备集成和可运行的特征 5个价值观:沟通.简单.反馈.勇气.谦逊   敏捷模型与瀑布模型的区别 相对于瀑布模型,提高开发效率和 ...

  4. git 跟踪分支 远程跟踪分支 学习笔记

    远程跟踪分支相当于一个只读仓库指针,从服务器上获取数据,不可以被本地直接修改. 跟踪分支相当于一个本地指针   用于项目更新和迭代. 1跟踪分支  (tracking  branch)   逻辑示意图 ...

  5. 拥抱移动端,jQueryui触控设备兼容插件

    http://touchpunch.furf.com/ ps:要FQ. jQuery UI Touch Punch Touch Event Support for jQuery UI Tested o ...

  6. 如何处理 jQuery $(window).resize() 中的方法被多次执行的小问题

    引言: 估计很多同志们在编写浏览器resize()的方法时,都会遇到这样的情况: 当拖动浏览器的边角时,页面中的一些效果随浏览器大小的改变而触发,这一过程开始到结束,resize() 中的方法被执行了 ...

  7. LeetCode 98——验证二叉搜索树

    1. 题目 2. 解答 2.1. 方法一 我们初始化根节点的范围为长整形数据的最小最大值 \([LONG\_MIN,LONG\_MAX]\),则其左子节点的取值范围为 \([LONG\_MIN,根节点 ...

  8. 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径

    题目 给定一个 n*m 的矩阵 A ,矩阵中每一个元素为一个十六进制数.寻找一条从左上角都右下角的路径,每次只能向右或者向下移动, 使得路径上所有数字之积在 16 进制下的后缀 0 最少. 输入描述: ...

  9. python3中使用python2中cmp函数出现错误

    在python2中我们经常会使用cmp函数来比较一些东西,但是在python3中,你再来使用这个函数的时候,发现就报错了,提示找不到这个函数,这是为啥呢? 答:新版的python已经舍弃这种用法 而在 ...

  10. Python3 小工具-ARP扫描

    from scapy.all import * import optparse import threading import os def scan(ipt): pkt=Ether(dst='ff: ...