HDU3686 Traffic Real Time Query System
2024-10-21 16:08:12
P.S.此题无代码,只有口胡,因为作者码炸了。
题目大意
给你一个有 \(n\) 个点, \(m\) 条边的无向图,进行 \(q\) 次询问,每次询问两个点 \(u\) \(v\),输出两个点的之间的路径经过了几个割点。
题解
这是一道模板题,先考虑用 \(Tarjan\) 求出割点的位置,再选择缩点。由于我们要缩的是点双连通分量,所以与强连通分量和边双连通分量有所不同。正解好像是圆方树,但是作者这里使用的是自己口胡的一种方法(一直过不了可能就是因为它,但是找不出错)。
对于这样的一个图,我们不像其他的点双连同分量一样缩点,将割点归于周围的点双连同分量,而是将割点与其相连的边断开,如下图:
每一个点双连同分量最后形成的连同块都是不包括割点的,但是包括连向割点的边,这一步骤我们可以通过 \(DFS\) 完成,还是容易的。
错误代码(思路大概是没问题的,大家可以先看看):
for(int i=1;i<=n;++i)
{
if(!dfn[i])
tarjan(i,i);//找割点
}
for(int i=1;i<=n;++i)
{
if(cut[i])
{
bel[i]=++len;//割点自己作为独立的点
dis[len]=1;//割点对于答案的贡献
}
if(cut[i]||vis[i])
continue;
vis[i]=true;
bel[i]=++len;
dfs1(i,len);//标记加tag,点和边都要
}
for(int i=1;i<=m;++i)//建图
{
if(cut[u[i]]&&cut[v[i]])
{
tag[i]=++len;
add(bel[u[i]],len);
add(len,bel[u[i]]);
add(bel[v[i]],len);
add(len,bel[v[i]]);
fa[find(bel[v[i]])]=len;
fa[find(bel[u[i]])]=len;
fa[len]=len;
continue;
}
int fu=find(bel[u[i]]),fv=find(bel[v[i]]);//用并查集维护联通性
if(fu!=fv)
{
add(bel[u[i]],bel[v[i]]);
add(bel[v[i]],bel[u[i]]);
fa[fu]=fv;
}
}
缩点完成了之后,这幅图就变成了森林(不保证图联通),然后我们可以愉快地用 \(DFS\) 统计任意一点到根的答案,然后跑树上 \(LCA\) ,用容斥原理统计答案。
错误代码如下:
for(int i=1;i<=Q;++i)
{
scanf("%d%d",&x,&y);
printf("%d\n",dis[tag[x]]+dis[tag[y]]-dis[tmp]-dis[to[tmp][0]]);
}
最新文章
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
- RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用
- 解释器模式(Interpreter Pattern)
- php设计模式--单例模式
- webView(简单的浏览器)
- Android 云服务器的搭建和友盟APP自动更新功能的实现
- Linux常用命令英文全称与中文解释Linux系统
- (五)CSS伪类(Pseudo-class)
- Linux 静态库&;动态库调用
- 解决Eclipse中文乱码的方法
- shapeless官方指南翻译写在前面
- 关于QT5使用QtScript解析QJsonArray数组的问题
- 关于win10系统1709版本安装JDK出现变量配置正确但仍有“java不是内部或外部命令”的解决办法
- char和unsigned char--数据类型区别
- nginx新增tcp模板
- node.js 调试 eggs launch.json配置信息
- Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
- libtorch初体验
- 关于win10系统配置变量时,javac编译不出的原因:没用好百度!
- Centos7 安装MySQL8.0.15