这个题目网上有很多答案,代码也很像,不排除我的。大家的思路应该都是taijan求出割边,然后找两个点的LCA(最近公共祖先),这两个点和LCA以及其他点构成了一个环,我们判断这个环上的割边有几条,我们的答案就少几个。

  有人问,这个题重边怎么办呢,重边肯定不是桥啊。额……对于这个我只能说,这个题的原始图应该是没有重边的,后来加的边可能会有重边,不过不影响我们的判断,因为我们通过标记点的方式去判的。(这个题还是应该说明一下啊,题目有点问题……)。

  其次,这个题的好玩之处来了,网上人分享的代码,居然过不了一组很简单的样例(如下),(现在大多人可能已经修正了),其实这个原因我应该是找到了,那就是dfn(出生日期)和deep(深搜的层数)的使用错误,当你使用deep的时候交换两者的值是没错的,因为我们总能让他们调整到一层上,然后他们的LCA也一定在一层上了,使用fa数组可以追溯到他们的LCA。然而如果是用dfn交换两者的值就是错误的了,因为即使你调整了他们的值满足一定的大小关系,他们也不一定在一层上,很有可能追溯到了环的外面,所以在追溯的时候很可能会多减上几条边。也就是出现了下面的样例,答案是1,有人输出了0;

  其实这个地方我一直有一个疑惑,那就是使用dfn判断的时候,最后的时候居然会出现二者不相等的情况,这与深搜的性质相违背,到现在也没找到一个样例可以说明他是正确的,我确实感觉到当判断完前两个循环的时候dfn【u】就是他们的LCA了,这个疑惑我先放到这里,便于以后解答,在以后我会主要选择记录深度的方法去做,比较好理解,比较保险(就如我下面代码里的方法)

  附:这个题还有一个解决方法,就是求双连通分量,通过判断两点是否在一个分量里判断两点之间的边是否为桥,然后再合并这两个点。求连通分量的办法一种是并查集,在判断的时候合并到一个集合里,一种是栈的储存方式,id数组,与有向图求强连通分量的方法一致。注意无向图的双连通分量不是指能否相互到达,而是指这个分量里面不含桥,所以当两个点不在一个集合中的时候,这条边一定就是桥。

6 5
1 2
2 3
2 4
3 5
4 6
1
5 6

答案:1

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 100010
int head[maxn],dfn[maxn],low[maxn],fa[maxn],deep[maxn];
int all,tot,bridge[maxn],brinum;
struct Edge
{
int to,nxt;
} edge[*maxn];
void addadge(int a,int b)
{
edge[tot].to = b;
edge[tot].nxt = head[a];
head[a] = tot++;
}
void dfs(int u,int pa)
{
low[u] = dfn[u] = ++all;
deep[u] = deep[pa] + ;
for(int i = head[u]; i != -; i = edge[i].nxt)
{
int v = edge[i].to;
if(!dfn[v])
{
fa[v] = u;
dfs(v,u);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u])
{
bridge[v] = ;
brinum++;
}
}
else if(v != pa) low[u] = min(low[u],dfn[v]);
}
}
void lca(int a,int b)
{
while(deep[a] > deep[b])
{
if(bridge[a])
{
bridge[a] = ;
brinum--;
}
a = fa[a];
}
while(deep[b] > deep[a])
{
if(bridge[b])
{
bridge[b] = ;
brinum--;
}
b = fa[b];
}
while(a != b)
{
if(bridge[a])
{
bridge[a] = ;
brinum--;
}
if(bridge[b])
{
bridge[b] = ;
brinum--;
}
a = fa[a];
b = fa[b];
}
}
int main()
{
int n,m,q,a,b,ca = ;
while(~scanf("%d%d",&n,&m))
{
if(!n && !m) break;
for(int i = ; i <= n; i++)
{
head[i] = -;
dfn[i] = ;
low[i] = ;
fa[i] = i;
deep[i] = ;
bridge[i] = ;
}
tot = ;
all = ;
brinum = ;
for(int i = ; i < m; i++)
{
scanf("%d%d",&a,&b);
addadge(a,b);
addadge(b,a);
}
dfs(,);
scanf("%d",&q);
printf("Case %d:\n",++ca);
while(q--)
{
scanf("%d%d",&a,&b);
lca(a,b);
printf("%d\n",brinum);
}
puts("");
}
return ;
}

POJ 1236 Network of Schools(tarjan算法 + LCA)的更多相关文章

  1. Poj 1236 Network of Schools (Tarjan)

    题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...

  2. POJ 1236 Network of Schools (Tarjan + 缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12240   Accepted: 48 ...

  3. POJ 1236 Network of Schools Tarjan缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22729   Accepted: 89 ...

  4. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  5. POJ 1236 Network of Schools(强连通分量)

    POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...

  6. [tarjan] poj 1236 Network of Schools

    主题链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K To ...

  7. poj 1236 Network of Schools(连通图入度,出度为0)

    http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  8. poj 1236 Network of Schools(又是强连通分量+缩点)

    http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  9. POJ 1236 Network of Schools(Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16806   Accepted: 66 ...

  10. poj 1236 Network of Schools(tarjan+缩点)

    Network of Schools Description A number of schools are connected to a computer network. Agreements h ...

随机推荐

  1. NOIP2011-普及组复赛模拟试题-第一题-NBA总冠军

    题目背景 Background 一年两度的期末考要到来了!!  题目描述 Description   又要到考试了,Ljw决定放松一下,就打开电视,看见了篮球赛,他立即想到了每年的NBA总冠军队伍.由 ...

  2. ZIP文件解压

    public class DZip { /// <summary> /// 压缩为ZIP文件 /// </summary> public void Zip(string dir ...

  3. csv格式导出文件

    先上传连个图片看看效果,这是界面效果dwz框架(springmvc开发) 点击导出csv效果图 js部分的代码(带条件查询的csv导出): function exportReportCsv(){ ex ...

  4. HTTPS科普扫盲帖【转】

    为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...

  5. 如何直观的解释back propagation算法?

    转自:知乎-https://www.zhihu.com/question/27239198 作者:匿名用户链接:https://www.zhihu.com/question/27239198/answ ...

  6. Laravel框架开发规范-修订版

    1.PHP编码规范 1.1 标签 PHP 程序可以使用<?php ?>或<?= ?>来界定PHP代码 在HTML 页面中嵌入纯变量时,使用<?= ?>这样的形式 纯 ...

  7. 背包问题matlab程序

    clearclca=0.95k=[5;10;13;4;3;11;13;10;8;16;7;4];k=-k;d=[2;5;18;3;2;5;10;4;11;7;14;6];restriction=46; ...

  8. 十八、oracle 角色

    一.介绍角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理.假定有用户a,b,c为了让他们都拥有如下权限1. 连接数据库2. 在scott.emp表上select,insert,up ...

  9. Spring的后置处理器BeanPostProcessor

    一.BeanPostProcessor接口的作用 如果我们需要在Spring容器完成Bean的实例化.配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProce ...

  10. eclipse新建workspace使用之前workspace的个性配置

    为使新建的workspace(称作A)的配置,比如主题等等,和之前的workspace(称作B)的配置一样: . 关闭eclipse . 将A中.metadata/.plugins目录下所有文件.文件 ...