留个e-DCC的板子

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
int z,dfn[],low[];
bool b[];
void tarjan(int x,int fr)
{
dfn[x]=low[x]=++z;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(dfn[y]==)
{
tarjan(y,x);
low[x]=min(low[x],low[y]); if(dfn[x]<low[y])
b[k]=b[k^]=true;
}
if(y!=fr)
low[x]=min(low[x],dfn[y]);
}
}
int cnt,bel[];
void sdfj(int x,int fr)
{
bel[x]=cnt;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(bel[y]==&&b[k]==false)
sdfj(y,x);
}
} //--------------------缩点---------------------- int Bin[];
int f[][],dep[];
void dfs(int x)
{
for(int i=;dep[x]>=Bin[i];i++)f[i][x]=f[i-][f[i-][x]]; for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=f[][x])
{
f[][y]=x;
dep[y]=dep[x]+;
dfs(y);
}
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=Bin[i])x=f[i][x];
if(x==y)return x;
for(int i=;i>=;i--)
if(dep[x]>=Bin[i]&&f[i][x]!=f[i][y])x=f[i][x],y=f[i][y];
return f[][x];
} int main()
{
int n,m,T_T=;
scanf("%d%d",&n,&m);
len=;memset(last,,sizeof(last));
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
z=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(b,false,sizeof(b));
tarjan(,); cnt=;
memset(bel,,sizeof(bel));
for(int i=;i<=n;i++)
if(bel[i]==) cnt++, sdfj(i,);
int tp=;
memset(last,,sizeof(last));
for(int i=;i<=len;i++)
{
if(bel[a[i].x]!=bel[a[i].y])
{
tp++;
a[tp].x=bel[a[i].x];
a[tp].y=bel[a[i].y];
a[tp].next=last[a[tp].x];
last[a[tp].x]=tp;
}
}
len=tp; Bin[]=;for(int i=;i<=;i++)Bin[i]=Bin[i-]*;
f[][]=;dep[]=;dfs(); int Q,ans=cnt-;
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&x,&y);x=bel[x],y=bel[y];
int lca=LCA(x,y);
printf("%d\n",dep[x]-dep[lca]+dep[y]-dep[lca]);
}
return ;
}

最新文章

  1. 站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
  2. github指令
  3. (转)Should 断言的基本使用方法
  4. javascript判断某种元素是否进入可视区域
  5. des加密解密——java加密,php解密
  6. 内网安装ubuntu包
  7. js SVG
  8. [OC Foundation框架 - 8] NSArray排序
  9. Info.plist和pch文件的作用
  10. C# Wpf异步修改UI,多线程修改UI(二)
  11. 【Android Developers Training】 14. 序言:管理Activity生命周期
  12. 10款 Mac 系统优化清理工具软件推荐和下载
  13. OpenCV+Qt+CMake安装+十种踩坑
  14. 【Spring】7、拦截器HandlerInterceptor
  15. Loogn.OrmLite文档
  16. 【Spark】Sparkstreaming-性能调优
  17. 阅读&lt;All Digital VCXO Replacement for Gigabit Transceiver Applications&gt;笔记(2)---XAPP589
  18. opencv读取并播放avi视屏
  19. iOS.Compiler
  20. js中的extend,可实现浅拷贝深拷贝

热门文章

  1. 去除IOS苹果手机自带按钮样式的问题~
  2. html5——2D转换
  3. Python语言之控制流(if...elif...else,while,for,break,continue)
  4. 【LaTeX】对xelatex的中英文设置不同的字体
  5. iOS 9 中可用的受信任根证书列表
  6. Windows Phone 8: NavigationInTransition实现页面切换效果
  7. (Entity framework 应用篇)把权限判断封装在数据库访问层
  8. CAD全屏显示控件
  9. Eclipse 使用前的配置
  10. 小白年薪24万,为什么Linux运维工程师薪资这么高?