这题是比较模板的找点双联通并记录的题目。

  题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数;2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数。

  分析:1.即桥的条数;2.找出点双联通分量,在他们内部找重复的边,或者换句话说,找出所有点双联通分量,边数大于点数的,这些边都是冲突的。

  那么,什么是点双联通分量呢,就是任意两点都有两条或以上的路径,这些路径的点除了这两点以外,都不相同,或者说,内部无割点,像数字8的形状就不是,8是边双联通;或者再换句话说,任意两边都在一个简单环内。

  而边双联通图呢,是任意一边都在一个简单环内。或者说,所有边都不是桥。

  搞清楚这两点就可以了。然后代码都是模板的问题,代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <stack>
#include <set>
using namespace std;
typedef pair<int,int> pii; int n,m;
vector<int> G[+];
int dfn[+],low[+];
int dfs_clock,cnt_qiao,cnt_scc;
vector<pii> block[+];
int vis[+];
stack<pii> S; void init()
{
for(int i=;i<n;i++) G[i].clear();
memset(dfn,,sizeof(dfn));
dfs_clock=;
cnt_qiao=;
cnt_scc=;
for(int i=;i<n;i++) block[i].clear();
} void dfs(int u,int fa)
{
dfn[u]=low[u]=++dfs_clock;
for(int i=;i<G[u].size();i++)
{
int v = G[u][i];
if(v==fa) continue;
//S.push(pii(u,v));
//不能在这里push边,不然会出现重边 if(!dfn[v]) //这是从父到子的访问顺序,只有这个顺序才能判断是不是割点或者桥
{
S.push(pii(u,v));
dfs(v,u);
low[u]=min(low[u],low[v]); if(dfn[u]<=low[v]) //这一点是准割点(在根处不成立)
{
for(;;)
{
pii t = S.top();S.pop();
block[cnt_scc].push_back(t);
if(t.first==u && t.second==v) break;
}
cnt_scc++;
}
if(dfn[u]<low[v]) cnt_qiao++;
}
else if(dfn[v]<dfn[u]) //这是子到父的访问顺序,即反向边
{
S.push(pii(u,v));
low[u]=min(low[u],dfn[v]);
}
}
} void solve()
{
for(int i=;i<n;i++) if(!dfn[i]) dfs(i,-); int cnt=; for(int i=;i<cnt_scc;i++)
{
memset(vis,,sizeof(vis));
int cnt_edge = block[i].size();
int cnt_point=;
for(int j=;j<block[i].size();j++)
{
pii t = block[i][j];
int u = t.first,v = t.second;
if(!vis[u]) vis[u]=,cnt_point++;
if(!vis[v]) vis[v]=,cnt_point++;
} if(cnt_point<cnt_edge)
{
cnt+=cnt_edge;
}
} printf("%d %d\n",cnt_qiao,cnt);
} int main()
{
while(scanf("%d%d",&n,&m)==)
{
if(n== && m==) break;
init(); for(int i=;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
} solve();
}
return ;
}

HDU 3394 Railway —— (点双联通,记录块信息)的更多相关文章

  1. HDU3394 Railway —— 点双联通分量 + 桥(割边)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 Railway Time Limit: 2000/1000 MS (Java/Others)   ...

  2. hdu 2460 poj 3694 (双联通+LCA)

    在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖 ...

  3. hdu 3352 求边双联通分量模板题(容器)

    /*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h ...

  4. hdu 3394 Railway

    这是一道用tarjin求双连通分量的题: 其中,不需要修的道路就是桥的数目: 在图的每个极大环中,如果点的数目小于边的数目,显然这个环中含有子环,并且这个环的边数就是这个环中有冲突的边的数目: 如果点 ...

  5. hdu 3849 (双联通求桥)

    一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...

  6. hdu 4612 (双联通+树形DP)

    加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...

  7. hdu 4738 (双联通求桥)

    2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...

  8. HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

    题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...

  9. hdu 2242双联通分量+树形dp

    /*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...

随机推荐

  1. select into from与insert into select区别

    创建一个table2  向table2中插入 table1中name为11的所有行(前提table2不存在) select * into table2 from table1 where name=‘ ...

  2. SMTP实现发送邮箱1

    #include "stdafx.h" #include <iostream> #include <WinSock2.h> using namespace ...

  3. regex 正则分割字符串

    string _content=adak.sjdkajskj爱25教:师的656教案时; string en=@"\.|56|25";//单个[asj]分别以a,s,j为分隔符. ...

  4. javaIO——PipedReader 和 PipedWriter 实现模拟即时聊天

    上一篇学习了javaIO里面的 PipedReader 和 PipedWriter,这里对两个类做一个小小的练习:实现一个即时消息发送和接收的聊天系统(这里只实现单向发送,双向同理,定义两个管道即可) ...

  5. Web框架概述——React.js

    目前,在前端Web开发中,三大热门框架为React.js,Vue.js,Angular.js .当然,三大框架各有各的优缺点,这里就不多说了,下面我就针对前段时间所学的React框架做一下整体知识点的 ...

  6. FlowPortal BPM 安装环境的配置

    l  操作系统:Windows Server 2003 及以上: l  IIS: 在Internet信息服务(IIS)管理器中将ISAPI和CGI限制全部设为“允许” l  需要安装.Net Fram ...

  7. UART串口简介

    通用异步收发传输器(Universal Asynchronous Receiver Transmitter) 原理 发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出 ...

  8. vue 项目文件流数据格式转blob图片预览展示

    为了图片安全性,有时候上传图片后后台不会直接返回图片地址,会返回文件流的数据格式,这种格式需要处理下才能展示在页面上   // 使用axios请求上传接口 axios({ method: 'get', ...

  9. C语言编译过程及相关文件

    1,C程序编译步骤 C代码编译成可执行程序经过4步: 1)预处理:宏定义展开.头文件展开.条件编译等,同时将代码中的注释删除,这里并不会检查语法 2)编译:检查语法,将预处理后文件编译生成汇编文件 3 ...

  10. 利用FastReport直接生成条码

    procedure TForm1.Button1Click(Sender: TObject); var x:TfrxbarCodeView; begin x:=TfrxbarCodeView.Crea ...