题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1588

吐下槽,不得不说ZOJ好坑,模版题做了一个多小时。

题意:
*        给出一个无向图,输入n(表示n个定点,1~n), m(m条边,有重边),
*        (2 <= N <= 10 000, 1 <= M <= 100 000),求这个无向图中的桥,
*        并输出桥属于输入中边的id.

之前学图的连通性因为没看懂双连通分量,就把连通性的这些知识点搁置了,一直没有刷这方面的题,由于之前已经弄懂求桥的算法,所以看到题就直接上了,结果被一些

小错误给击败了,还好算法的思想没出问题,贴一下代码,以后当模版用。求桥:low[v]>dfn[u](u,v)为树枝边。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stack>
#define N 10010
using namespace std;
struct node
{
int x,y,w,next,flag;
} eg[*N];
int tt,head[N],dfn[N],low[N],ti,n,m,top;
int f[*N];
void init()
{
tt=;
ti=;
top=;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(f,0,sizeof(f));
}
void add(int xx,int yy,int nu)
{
for(int i=head[xx]; i!=-; i=eg[i].next)//去重
{
if(eg[i].y==yy)
{
eg[i].flag=;
return ;
}
}
eg[tt].x=xx;
eg[tt].y=yy;
eg[tt].w=nu;
eg[tt].flag=;
eg[tt].next=head[xx];
head[xx]=tt++;
}
void tarjan(int u,int fa)
{
dfn[u]=low[u]=ti++;
for(int i=head[u]; i!=-; i=eg[i].next)
{
int v=eg[i].y;
if(v==fa) continue;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]&&!eg[i].flag)
{
f[top++]=eg[i].w;
}
}
else //无向图没有横跨边
{
low[u]=min(dfn[v],low[u]);
}
}
}
int main()
{
int T,xx,yy;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d %d",&n,&m);
for(int i=; i<=m; i++)
{
scanf("%d %d",&xx,&yy);
add(xx,yy,i);
add(yy,xx,i);
}
tarjan(,-);
int sum=;
for(int i=; i<=m; i++)
{
if(f[i])
sum++;
}
printf("%d\n",top);
if(top)
{
sort(f,f+top);
for(int i=; i<top-; i++)
{
printf("%d ",f[i]);
}
printf("%d\n",f[top-]);
}
if(T!=) printf("\n");
}
return ;
}
//无向图是没有横边的

我不知道为什么这么写就PE

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stack>
#define N 10010
using namespace std;
struct node
{
int x,y,w,next,flag;
}eg[*N];
int tt,head[N],dfn[N],low[N],ti,n,m;
bool f[*N];
void init()
{
tt=;
ti=;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(f,false,sizeof(f));
}
void add(int xx,int yy,int nu)
{
for(int i=head[xx];i!=-;i=eg[i].next)
{
if(eg[i].y==yy)
{
eg[i].flag=;
return ;
}
}
eg[tt].x=xx;
eg[tt].y=yy;
eg[tt].w=nu;
eg[tt].flag=;
eg[tt].next=head[xx];
head[xx]=tt++;
}
void tarjan(int u,int fa)
{
dfn[u]=low[u]=ti++;
for(int i=head[u];i!=-;i=eg[i].next)
{
int v=eg[i].y;
if(v==fa) continue;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]&&!eg[i].flag)
{
f[eg[i].w]=true;
}
}
else //无向图没有横跨边
{
low[u]=min(dfn[v],low[u]);
}
}
}
int main()
{
int T,xx,yy;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d %d",&xx,&yy);
add(xx,yy,i);
add(yy,xx,i);
}
tarjan(,-);
int sum=;
for(int i=;i<=m;i++)
{
if(f[i])
sum++;
}
printf("%d\n",sum);
int F=;
for(int i=;i<=m;i++)
{
if(f[i])
{
if(F)
{
printf("%d",i);
F=;
}
else printf(" %d",i);
}
}
printf("\n");
if(T!=) printf("\n");
}
return ;
}
//无向图是没有横边的

ZOJ2588:Burning Bridges(无向连通图求割边)的更多相关文章

  1. ZOJ 2588 Burning Bridges(无向连通图求割边)

    题目地址:ZOJ 2588 由于数组开小了而TLE了..这题就是一个求无向连通图最小割边.仅仅要推断dfn[u]是否<low[v],由于low指的当前所能回到的祖先的最小标号,增加low[v]大 ...

  2. 无向连通图求割边+缩点+LCA

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7082   Accepted: 2555 Descripti ...

  3. 无向连通图求割边(桥)hdu4738,hdu3849

    点击打开链接 题目链接:   hdu 4738 题目大意:   曹操有N个岛,这些岛用M座桥连接起来 每座桥有士兵把守(也可能没有) 周瑜想让这N个岛不连通,但只能炸掉一座桥 并且炸掉一座桥需要派出不 ...

  4. ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang

    Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...

  5. zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】

    Burning Bridges Time Limit: 5 Seconds      Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...

  6. ZOJ2588 Burning Bridges 无向图的割边

    题目大意:求无向图的割边编号. 割边定义:在一个连通图中,如果删去一个边e,图便变成不连通的两个部分,则e为该图的割边. 求法:边(u,v) 不是割边,当且仅当边(u,v)在一个环内.因此所有不在环内 ...

  7. ZOJ2588 Burning Bridges(割边模板)

    题目要输出一个无向图的所有割边.用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边). 顺便求出每个结点的DFS序dfn ...

  8. zoj2588 Burning Bridges(无向图的桥)

    题目请戳这里 题目大意:给一张无向图,现在要去掉一些边,使图仍然连通,求不能去掉的边. 题目分析:就是求无向图的桥. tarjan算法跑一遍,和无向图割点十分类似,这里要找low[v] > df ...

  9. 无向连通图求割点(tarjan算法去掉改割点剩下的联通分量数目)

    poj2117 Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3603   Accepted: 12 ...

随机推荐

  1. 彩色图像的直方图均衡化matlab代码

    彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...

  2. mysql数据库binary log中的事件到底是什么?

    需求描述: 最近看mysql备份恢复的时候,基于时间点恢复,提到了binary log中存的是"事件" 那么到底什么是事件呢 概念解释: binary log中存的是事件(even ...

  3. 理解ros话题--6

    理解ROS话题(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程介绍ROS话题(topics)以及如何使用ro ...

  4. mybatis由浅入深day02_7.4mybatis整合ehcache_7.5二级缓存应用场景_7.6二级缓存局限性

    7.4 mybatis整合ehcache EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速.精干等特点,是Hibernate中默认的CacheProv ...

  5. Java精选笔记_网络编程

    网络编程 概述 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(C ...

  6. Android项目结构介绍

    src/存放Java源代码gen/中存放系统自动生成的配置文件Android 4.4.2下包含android.jar文件,这是一个Java归档文件,其中包含构建应用程序所需的所有的Android SD ...

  7. PHP自带方法验证邮箱、URL、IP是否合法

    PHP验证邮箱.URL.IP是否合法 以前用PHP验证邮箱.URL.IP是否合法都是通过自己写正则来实现,但是有时候脑子发昏,可能会写出一个不是完全正确的正则,导致验证出错,今天发现原来PHP本身自带 ...

  8. Ubuntu远程登录服务器--ssh的安装和配置

    ssh是一种安全协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全. 安装ssh sudo apt-get update sudo apt-get install openssh-serve ...

  9. javascript关于链接的一些用法

    (1)javascript:openURL() http://www.kpdown.com/search?name=Ben Nadel 此URL后边有一个name参数,只不过参数的值竟然带了空格,这样 ...

  10. @font-face 字体

    一.@font-face是CSS3中的一个模块,把自己定义的Web字体嵌入到你网页中 @font-face的语法规则 @font-face { font-family: <YourWebFont ...