题意:求无向图的割边。

  思路: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. hdu 5876 Sparse Graph icpc大连站网络赛 1009 补图最短路

    BFS+链表 代码改自某博客 #include<stdio.h> #include<iostream> #include<algorithm> #include&l ...

  2. hdu 1859 最小长方形

    Description 给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内.长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内. Input ...

  3. Tyvj-TOM的无穷序列

    背景 蛟川书院模拟试题 描述 TOM有一个无穷序列中如下:110100100010000100000.....请你帮助TOM找出在这个无穷序列中指定位置上的数字 输入格式 第一行一个正整数N,表示询问 ...

  4. Java 基于log4j的日志工具类

    对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...

  5. javaScript中的一些知识

    利用js动态生成table <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http ...

  6. Ubuntu 12.04 中自定义DNS服务器设置

    首先我们需要创建一个文件/etc/resolvconf/resolv.conf.d/tail: #vim /etc/resolvconf/resolv.conf.d/tail 然后我们在这个文件里写入 ...

  7. shape的使用

    android在布局边缘位置处理圆角的两个办法: 1),一个是直接让美工切一张带有圆角的图片. 2),使用shape来解决. 第一种不在赘述,主要讲一下第二中方法来实现. 上边缘出现圆角,下边缘正常的 ...

  8. UVA 796 Critical Links

    输出桥. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  9. 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 引用:   http://www.cnblogs.com/maxao/archive/2011/03/18/19881 ...

  10. mb_detect_encoding() 运行sitemap.php 字符编码不能转换修改php.ini

    1.phpinfo() 找php.ini位置 2.备份然后 php.ini文件中顶部添加extension=php_mbstring.dll Call to undefined function mb ...