题目: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. 第一章 Spring.Net介绍

    1.1 概述 在Java社区中Spring经历的长时间的考验,已经是一套很成熟稳定的框架.而Spring.Net 的前身是 Java版的Spring.Spring.Net是以Java版的Spring框 ...

  2. Android-Gallery GridView ImageSwitcher 使用

    http://liangruijun.blog.51cto.com/3061169/647355/ http://blog.csdn.net/wantianwen/article/details/23 ...

  3. laravel 强大的关联模型

    内容比较多,不总结了,直接看学院君的译文吧,已经写得很详细了 传送门:http://laravelacademy.org/post/6191.html PS1: laravel的关联模型并不是遍历一次 ...

  4. Thinkphp 修改U方法按路由规则生成url

    tp开户路由后,使用U方法是不会按路由规则生成url的,一般我们是要手动修改模版,把里面的U方法去掉,手动修改链接,如果是已经写好的程序,后期才添加路由,修改起链接就太麻烦了 今天无聊就修改了一下U方 ...

  5. poj_1456 贪心

    题目大意 一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该日期之前卖出可以获得收益,否则就无法卖出),且每种物品被卖出都有一个收益值Pi. 卖出每个物品需要耗时1天, ...

  6. CSS写表格

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content_Type" content ...

  7. 点击button,button背景图片变化

    1.设置背景渐变效果,在drawable目录下建buttonshape.xml文件, 内容为: <?xml version="1.0" encoding="utf- ...

  8. java基础---->多个排序的拓展

    根据一些特定的规则,我们可以利用java的反射机制做到很有趣的封装. java的排序封装 一.定义一些comparator AmountComparatorAsc:amount升序 package c ...

  9. java三方---->html解析jsoup的使用

    jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据.今天我 ...

  10. click() bind() live() delegate()区别

    click(),bind(),live()都是执行事件时使用的方法 1.click()单击事件方法: $("a").click(function() { alert("h ...