博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3694 Network
阅读量:7118 次
发布时间:2019-06-28

本文共 1730 字,大约阅读时间需要 5 分钟。

连通分量+LCA

题意:一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上)

首先运行一次tarjan,求出桥和缩点,那么远无向图将缩点为一棵树,树边正好是原来的桥。每次连接两点,看看这两点是不是在同一个缩点内,如果是,那么缩点后的树没任何变化,如果两点属于不同的缩点,那么连接起来,然后找这两个缩点的LCA,,因为从点u到LCA再到点v再到点u,将形成环,里面的树边都会变成不是桥。计数的时候注意,有些树边可能之前已经被标记了,这次再经过不能再标记

 

首先按思路写了个代码,跑了2s多,因为显式建树了。不过如果理解好tarjan的话,其实发现不需要显式建树,可以利用tarjan留下的dfn和low的信息找LCA

另外找LCA这里用朴素的方法,因为这次找LCA是要找到路径的,而且途中有些边是被标记了的。朴素的方法就是在树中记录节点的父亲,然后沿着父亲走回根去

修改后跑了1s多一点。牛人是用并查集来缩点,能跑出200ms

 

#include 
#include
#include
#include
#include
using namespace std;#define N 100010#define M 200010vector
ver[N];int head[N],dfn[N],low[N],vis[N],fa[N],dcnt,bcnt;struct edge{ int u,v,used,next;}e[2*M];bool isbridge[N];inline void add(int u, int v ,int &k){ e[k].v = v; e[k].used = 0; e[k].next = head[u]; head[u] = k++;}void LCA(int u,int v){ if(dfn[u] < dfn[v]) swap(u,v); while(dfn[u] > dfn[v]) { if(isbridge[u]) bcnt--; isbridge[u] = false; u = fa[u]; } while(u!=v) { if(isbridge[u]) bcnt--; if(isbridge[v]) bcnt--; isbridge[u] = isbridge[v] = false; u = fa[u]; v = fa[v]; }}void dfs(int u){ vis[u] = 1; dfn[u] = low[u] = ++dcnt; for(int k=head[u]; k!=-1; k=e[k].next) if(!e[k].used) { e[k].used = e[k^1].used = 1; int v = e[k].v; if(!vis[v]) { fa[v] = u; dfs(v); low[u] = min(low[u] , low[v]); if(dfn[u] < low[v]) { bcnt++; isbridge[v] = true; } } else if(vis[v] == 1) low[u] = min(low[u],dfn[v]); } vis[u] = 2;}int main(){ int n,m,q,cas=0; while(scanf("%d%d",&n,&m)!=EOF) { if(!n && !m) break; memset(head,-1,sizeof(head)); int k = 0; for(int i=0; i

 

转载于:https://www.cnblogs.com/scau20110726/archive/2013/05/29/3106073.html

你可能感兴趣的文章
solr安装配置
查看>>
SAS接口互连完全指南
查看>>
Word 2003中打开最近操作过的文档的两种推荐的方法
查看>>
LAMP+LNMP视频教程
查看>>
Linux下创建与解压zip, tar, tar.gz和tar.bz2文件
查看>>
《微服务》九大特性重读笔记
查看>>
肯定赚钱的炒股软件
查看>>
基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
查看>>
MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据
查看>>
Don’t Worry.Be Scruffy.
查看>>
针对敲诈病毒(WanaCrypt0r2.0)的应对方案
查看>>
tornado和subprocess实现程序的非堵塞异步处理
查看>>
性能压测诡异的Requests/second 响应刺尖问题
查看>>
ACT的摘要可以告诉我们的内容
查看>>
一款开源Office软件---Lotus Symphony在Linux系统下的应用
查看>>
51CTO博客——架起我与读者沟通、见面的桥梁[博友话题]
查看>>
c++内存优化:二级间接索引模式内存池
查看>>
一条长为L的绳子,一面靠墙,另外三边组成矩形,问此矩形最大面积能是多少?...
查看>>
保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护 2
查看>>
NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息...
查看>>