题意:求出所有的割顶,而且还有输出该割顶连接了几个点双连通分量

题解:直接tarjan求点双联通分量就好了,可以在加入边的时候记录加入次数,大于1的都是桥,输入输出很恶心,注意格式

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std;
using namespace __gnu_cxx; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; map<int,int>ma[N];
vector<int>v[N],bcc[N];
int dfn[N],low[N];
int index,num;
int bccno[N],iscut[N];
struct edge{int from,to;};
stack<edge>s;
void tarjan(int u,int f)
{
low[u]=dfn[u]=++index;
for(int i=;i<v[u].size();i++)
{
int x=v[u][i];
edge e=(edge){u,x};
if(x==f)continue;
if(!dfn[x])
{
s.push(e);
tarjan(x,u);
low[u]=min(low[u],low[x]);
if(low[x]>=dfn[u])
{
num++;bcc[num].clear();
for(;;)
{
edge p=s.top();s.pop();
if(bccno[p.from]!=num)
{
bccno[p.from]=num;
bcc[num].pb(p.from);
iscut[p.from]++;
}
if(bccno[p.to]!=num)
{
bccno[p.to]=num;
bcc[num].pb(p.to);
iscut[p.to]++;
}
if(p.from==e.from&&p.to==e.to)break;
}
}
}
else
{
if(dfn[x]<dfn[u])low[u]=min(low[u],dfn[x]);
}
}
}
void init()
{
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(bccno,,sizeof bccno);
memset(iscut,,sizeof iscut);
index=num=;
for(int i=;i<=;i++)
{
v[i].clear();
bcc[i].clear();
ma[i].clear();
}
while(!s.empty())s.pop();
}
int main()
{
int a,b,n=,cnt=;
while(~scanf("%d",&a))
{
if(a==)break;
init();
scanf("%d",&b);
n=max(n,max(a,b));
v[a].pb(b);
v[b].pb(a);
ma[a][b]=ma[b][a]=;
while(~scanf("%d",&a))
{
if(a==)break;
scanf("%d",&b);
n=max(n,max(a,b));
if(!ma[a][b])
{
v[a].pb(b);
v[b].pb(a);
ma[a][b]=ma[b][a]=;
}
}
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i,-);
/* cout<<num<<endl;
for(int i=1;i<=num;i++)
{
for(int j=0;j<bcc[i].size();j++)
cout<<bcc[i][j]<<" ";
cout<<endl;
}*/
printf("Network #%d\n",++cnt);
bool ok=;
for(int i=;i<=n;i++)
{
if(iscut[i]>)
{
ok=;
printf(" SPF node %d leaves %d subnets\n",i,iscut[i]);
}
}
if(!ok)printf(" No SPF nodes\n");
puts("");
}
return ;
}
/************ ************/

poj1523割顶-点双联通的更多相关文章

  1. 图论算法-Tarjan模板 【缩点;割顶;双连通分量】

    图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...

  2. POJ1144 Network 无向图的割顶

    现在打算重新学习图论的一些基础算法,包括像桥,割顶,双连通分量,强连通分量这些基础算法我都打算重敲一次,因为这些量都是可以用tarjan的算法求得的,这次的割顶算是对tarjan的那一类算法的理解的再 ...

  3. Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)

    Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...

  4. POJ 2117 Electricity 双联通分量 割点

    http://poj.org/problem?id=2117 这个妹妹我竟然到现在才见过,我真是太菜了~~~ 求去掉一个点后图中最多有多少个连通块.(原图可以本身就有多个连通块) 首先设点i去掉后它的 ...

  5. 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)

    layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...

  6. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  7. Tarjan 强连通分量 及 双联通分量(求割点,割边)

    Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1)         有向图的强联通分量 (2)         无向图的双联通分量(求割点,桥) ...

  8. P3388 【模板】割点(割顶)

    P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...

  9. hihocoder #1190 : 连通性·四 点双联通分量

    http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...

随机推荐

  1. Unity使用native读取streamingasset里文件

    需求是,使用native方式,读取apk包里的lua代码,读进c#,做解密 一准备unity工程 public class GameMain : MonoBehaviour { public cons ...

  2. Python电影投票系统

    电影投票:程序先给出几个目前正在上映的电影列表. 由用户给每个电影投票.最终将该用户投票信息公布出来 lst = ['北京遇上西雅图', '解救吴先生', '美国往事', '西西里的美丽传说']结果: ...

  3. Python3.6全栈开发实例[023]

    23.税务部门征收所得税. 规定如下: (1)收入在2000以下的. 免征. (2)收入在2000-4000的, 超过2000部分要征收3%的税. (3)收入在4000-6000的, 超过4000部分 ...

  4. while循环。for循环

    1.while循环 基本循环格式 while 条件 : # 循环体 # 如果条件为真,那么循环体则执行 # 如果条件为假,那么循环体不执行 break:退出本层循环. continue:退出本次循环, ...

  5. ReentrantLock VS synchronized

    ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性. 此外,它还提供了在激烈争用情况 ...

  6. Linux中的awk命令

    awk '条件1{动作1} 条件2{动作2} ...'  文件名 条件: BEGIN          在处理文件里的第一行数据之前执行 END              在处理完文件里的最后一行数据 ...

  7. 【生产问题】--8KW的数据表导致业务卡顿

    问题描述:业务突然变得巨卡 分析思路: (1)分析用户请求进程:查看是否有长期运行霸占锁的情况,或者进程数量巨多.很明显我这里就是巨多,正常情况一般0~40来个的样子,在业务使用高峰期居然达到了140 ...

  8. 集成富文本编辑器XSS预防过滤措施

    # https://github.com/phith0n/python-xss-filter import re import copy from html.parser import HTMLPar ...

  9. JAVA & C++ 多态

    多态,也叫动态绑定. Java: class A { public void f1() { System.out.println("A:f1"); } public void f2 ...

  10. django admin基础

    通过onetoonefiled扩展得到的不会在添加user是自动添加原因是onetoonefiled只是一个model 可以they are just Django models that happe ...