题意:求无向图的割边。

  思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍)。

  需要注意的就是此处有多重边,题目中要求输出确定的不能被删除的边,而多重边的保留不是可以确定的,所以多重边都是不可以被保留的,我们可以在邻接表做一个flag的标记,判断他是不是多重边。

  注意建图的时候数组应该是m × 2,因为这里是无向边,当心RE!

  注意输出的时候编号是必须要拍好序再输出。

  还有一个地方需要注意的就是应该选择高效的建图方式,我一开始看见给了5秒,就用邻接矩阵建了图,毕竟他能很好的记录重边,但交上去并不好使。。。又换了vector,结果莫名其妙的程序崩溃,我都开始怀疑人生了,想到zoj一向以严格刁钻出名,干脆换了比较高效的链式前向星,总算是过了,下面是代码:

  后来的补充~  

这个后来尚尚告诉我判断边是否出现过可以用这种方法:图中最多有N个点,可以用map解决这个问题,把x和y这两个边压缩成一个整数10*N*X + Y,用map记录下这个数是否出现过,就是这条边有没有出现过.这种方法跑了800ms,我的那种方法跑了1000+ms,看来还是遍历的方式太蠢了,建议读者使用建议方式,如果卡时间也不怕了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 10010
int head[maxn],tot,dfn[maxn],low[maxn],ans_id[maxn*],ans,cnt;
struct EDGE
{
int to,nxt,flag,id;
} edge[maxn*];
void add_edge(int x,int y,int id)
{
bool mark = true;
int pos = ;
for(int i = head[x]; i != -; i = edge[i].nxt)
{
if(edge[i].to == y)
{
mark = false;
pos = i;
break;
}
}
if(!mark)
{
edge[pos].flag = ;
return;
}
edge[cnt].to = y;
edge[cnt].nxt = head[x];
edge[cnt].flag = ;
edge[cnt].id = id;
head[x] = cnt++;
}
void tarjan(int x,int fa)
{
dfn[x] = low[x] = ++tot;
for(int i = head[x]; i != -; i = edge[i].nxt)
{
int y = edge[i].to;
if(!dfn[y])
{
tarjan(y,x);
low[x] = min(low[x],low[y]);
if(low[y] > dfn[x] && !edge[i].flag)///判断重边
{
ans_id[ans++] = edge[i].id;
}
}
else if(y != fa)
low[x] = min(low[x],dfn[y]);
}
return;
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
cnt = ,tot = ,ans = ;
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i = ; i <= m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y,i);
add_edge(y,x,i);
}
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
tarjan(,-);
printf("%d\n",ans);
sort(ans_id,ans_id + ans);
if(ans != )
{
for(int i = ; i < ans; i++)
{
i == ? printf("%d",ans_id[i]) : printf(" %d",ans_id[i]);
}
printf("\n");
}
if(t)
puts("");
}
return ;
}

ZOJ Problem - 2588 Burning Bridges tarjan算法求割边的更多相关文章

  1. ZOJ 2588 Burning Bridges (tarjan求割边)

    题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...

  2. UVA 796 Critical Links (tarjan算法求割边)

    这是在kuangbin的题目里看到的,不得不吐槽一下,题目中居然没给出数据范围,还是我自己猜的-本来是一道挺裸的题,但是我wa了好多次,原因就是这里面有两个坑点,1重边特判,2输出时左边必须比右边小. ...

  3. ZOJ 2588 Burning Bridges(求桥的数量,邻接表)

    题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588 Burning Bridges Time Limit: 5 ...

  4. POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)

    题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...

  5. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

  6. tarjan算法求LCA

    tarjan算法求LCA LCA(Least Common Ancestors)的意思是最近公共祖先,即在一棵树中,找出两节点最近的公共祖先. 这里我们使用tarjan算法离线算法解决这个问题. 离线 ...

  7. [Tarjan系列] Tarjan算法求无向图的双连通分量

    这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...

  8. Tarjan算法求有向图强连通分量并缩点

    // Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...

  9. tarjan算法求无向图的桥、边双连通分量并缩点

    // tarjan算法求无向图的桥.边双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...

随机推荐

  1. 【VMware】VMware Workstation中虚拟机网络配置

    一直用的vmware的虚拟机以及UVP还有cirtix的虚拟机,然后对vmware workstation却一窍不通,这个怎么了得,下面介绍一下我学习中遇到的问题及解决办法. 一.准备工作: vmwa ...

  2. 文字编码转换器 V1.0 免费绿色版

    软件名称: 文字编码转换器 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / WinXP 软件大小: 920KB 图片预览: 软件简介: 文字编码转换器,能把普通文 ...

  3. ***1133. Fibonacci Sequence(斐波那契数列,二分,数论)

    1133. Fibonacci Sequence Time limit: 1.0 secondMemory limit: 64 MB is an infinite sequence of intege ...

  4. 本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。

    BASE64编码算法不算是真正的加密算法.     MD5.SHA.HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法.我们通常只把他们作为加密的基础.单纯的以上 ...

  5. php 分页类(3)

    <?php class Page { private $total; //总记录 private $pagesize; //每页显示多少条 private $limit; //limit pri ...

  6. C#获取键盘和鼠标操作的时间的类

    /// /// 创建结构体用于返回捕获时间 /// [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { /// /// 设置结构体 ...

  7. Strusts2--课程笔记4

    类型转换器: Struts2默认情况下可以将表单中输入的文本数据转换为相应的基本数据类型.这个功能的实现,主要是由于Struts2内置了类型转换器.这些转换器在struts-default.xml中可 ...

  8. 河南多校联合训练 南阳理工 1261 音痴又音痴的LT

    描述 LT最近一直在无限循环薛之谦的歌,简直都中毒了!可是呢…他的歌LT还是不会唱(其实不止他的歌LT不会唱,所有人的歌LT都不会唱…因为LT是标准的音痴)可是LT又很喜欢唱歌(所以LT不仅是音痴还是 ...

  9. CSS3秘笈:第六章

    第六章  文本格式化 1.font-family 属性设置字体.除了指定想要的字体之外还要使用备用字体.例如: p{ font-family:Arial ,Helvetica ,sans-serif; ...

  10. TeX括号。。。

    #include <stdio.h> #include <stdlib.h> int main() { ; ) { if(c=='"') { printf(" ...