题目链接:https://vjudge.net/problem/POJ-3694

具体思路:首先可以通过缩点的方式将整个图变成一个树,并且树的每条边是桥,但是我们可以利用dfn数组将整个图变成树,这样就可以省去缩点的过程了,同时lca的作用。假设有如下情况。

f->a    f->b,这是缩点之后的,如果在a,b之间加一条边的话,从a->a和b的最近公共祖先节点-> b 之间的桥都会去除,这个时候就需要用到lca了/

AC代码(折磨了我两天--):

 #include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<cstring>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
# define ll long long
# define maxn +
# define inf 0x3f3f3f3f
int head[maxn],dfn[maxn],low[maxn];
int judge[maxn];
int father[maxn];
int edge,num,n,m,ans;
struct node
{
int to;
int nex;
} q[maxn];
void init()
{
memset(judge,,sizeof(judge));
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
for(int i=; i<=n; i++)
{
father[i]=i;
}
edge=;
num=;
ans=;
}
void addedge(int fr,int to)
{
q[edge].to=to;
q[edge].nex=head[fr];
head[fr]=edge++;
}
void tarjan(int u,int root)
{
low[u]=dfn[u]=++num;
dfn[u]=dfn[root]+;//建造树的过程。
for(int i=head[u]; i!=-; i=q[i].nex)
{
int temp=q[i].to;
if(temp==root)continue;//如果 1-> 2 这条边已经访问过的话,2->1 就没有必要访问了,如果在访问的话会出问题的。
if(dfn[temp]==)
{
father[temp]=u;
tarjan(temp,u);
low[u]=min(low[u],low[temp]);
if(low[temp]>dfn[u])//判断桥的方法,注意比较的是前一个的时间戳
{
ans++;
judge[temp]=;
}
}
else if(temp!=u)
{
low[u]=min(low[u],dfn[temp]);
}
}
}
void lca(int t1,int t2)
{ while(dfn[t1]<dfn[t2])
{
if(judge[t2])ans--,judge[t2]=;
t2=father[t2];
}
while(dfn[t1]>dfn[t2])
{
if(judge[t1])
{
ans--;
judge[t1]=;
}
t1=father[t1];
}
while(t1!=t2)
{
if(judge[t1])ans--;
if(judge[t2])ans--;
judge[t1]=;
judge[t2]=;
t1=father[t1];
t2=father[t2];
}
}
int main()
{
int Case=;
while(~scanf("%d %d",&n,&m)&&(n+m))
{
init();
int t1,t2;
for(int i=; i<=m; i++)
{
scanf("%d %d",&t1,&t2);
addedge(t1,t2);
addedge(t2,t1);
}
tarjan(,);
int t;
printf("Case %d:\n",++Case);
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&t1,&t2);
lca(t1,t2);
printf("%d\n",ans);
}
printf("\n");
}
return ;
}

 

最新文章

  1. 模拟赛1101d1
  2. 在Windows驗證網站設定部分匿名存取
  3. 对话机器学习大神Yoshua Bengio(上)
  4. DebugView 调试工具
  5. 安装Laravel遇到You must enable the openssl extension to download files via https问题
  6. 多线程 (三)iOS中的锁
  7. linux 内核 编绎配制选项详解
  8. C++文件操作详解(ifstream、ofstream、fstream)
  9. Prototype 模式
  10. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶
  11. [Luogu2991][USACO10OPEN]水滑梯Water Slides
  12. java集成微软的ad域,实现单点登录
  13. iOS性能优化总结
  14. usb的一些网址
  15. “百度杯”CTF比赛 九月场 code
  16. 使用jsp内置对象request获取表单提交中文内容乱码的解决办法
  17. HDU 6130 Kolakoski
  18. 优化 ExpressRoute 路由
  19. 在PowerDesigner中设计物理模型1——表和主外键(转)
  20. kolla-ansible安装openstack(Ocata)

热门文章

  1. CentOS7 修改yum源为阿里云
  2. Linux架设DDNS服务器之自动更新脚本
  3. 中国省市 Json 二级联动
  4. 第76天:jQuery中的宽高
  5. HttpHandler与HttpModule的理解与应用
  6. ZOJ3067_Nim
  7. BZOJ5011 JXOI2017颜色(主席树)
  8. static变量的特点 - 只会有一份成员对象
  9. 【CF700E】Cool Slogans(后缀自动机)
  10. [HEOI2015]公约数数列