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

但是我之前说过,在判断割边的时候只需要直接记录就可以了,因为每条边只会访问一次,但其实这是取决于建图方式的,题目中给出了每个点都与之相连的点,所以我们建出的边一定会有重复的,所以需要用map去重一下,可以在建图的时候就判断(因为没有多重边),也可以在收集割边的时候判断。代码如下:

#include<map>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
map<int,int>ma;
#define maxn 10010
struct EDGE
{
int to,nxt;
} edge[*maxn];
int tot,n,dfn[maxn],low[maxn],head[maxn],all,resnum;
void add_edge(int u,int v)
{
edge[tot].to = v;
edge[tot].nxt = head[u];
head[u] = tot++;
}
void init()
{
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
all = ;
resnum = ;
ma.clear();
}
bool mul(int u,int v)
{
if(ma[u*maxn+v] || ma[v*maxn+u]) return true;
ma[u*maxn+v] = ma[v*maxn+u] = ;
return false;
}
struct Node
{
int x,y;
};
Node out[maxn];
void tarjan(int u,int fa)
{
dfn[u] = low[u] = ++all;
for(int i = head[u]; i != -; i = edge[i].nxt)
{
int v = edge[i].to;
if(!dfn[v])
{
tarjan(v,u);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u])
{
if(!mul(u,v))
{
int tmpu = u,tmpv = v;
if(tmpu > tmpv)
swap(tmpu,tmpv);
out[resnum].x = tmpu;
out[resnum].y = tmpv;
resnum++;
}
}
}
else if(v != fa) low[u] = min(low[u],dfn[v]);
}
return ;
}
bool cmp(Node a,Node b)
{
if(a.x != b.x) return a.x < b.x;
}
int getnum(char *a)
{
int lena = strlen(a);
int num = ,jw = ;
for(int i = ; i < lena; i++)
{
if(a[i] == ')')
{
for(int j = i-; j > ; j--)
{
num += (a[j]-'')*jw;
jw *= ;
}
// cout<<"num = "<<num<<endl;
return num;
}
}
}
int main()
{
int ans,m,x,y;
while(~scanf("%d",&n))
{
tot = ;
memset(head,-,sizeof(head));
for(int i = ; i < n; i++)
{
scanf("%d",&x);
char op[];
scanf("%s",op);
int m = getnum(op);
for(int j = ; j < m; j++)
{
scanf("%d",&y);
add_edge(x,y);
add_edge(y,x);
}
}
init();
for(int i = ; i < n; i++)
{
if(!dfn[i]) tarjan(i,-);
}
sort(out,out+resnum,cmp);
printf("%d critical links\n",resnum);
for(int i = ; i < resnum; i++)
{
printf("%d - %d\n",out[i].x,out[i].y);
}
puts("");
}
return ;
}

UVA 796 Critical Links (tarjan算法求割边)的更多相关文章

  1. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. Uva 796 Critical Links (割边+排序)

    题目链接: Uva 796 Critical Links 题目描述: 题目中给出一个有可能不连通的无向图,求出这个图的桥,并且把桥按照起点升序输出(还有啊,还有啊,每个桥的起点要比终点靠前啊),这个题 ...

  3. ZOJ Problem - 2588 Burning Bridges tarjan算法求割边

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

  4. UVA 796 Critical Links(Tarjan求桥)

    题目是PDF就没截图了 这题似乎没有重边,若有重边的话这两点任意一条边都不是桥,跟求割点类似的原理 代码: #include <stdio.h> #include <bits/std ...

  5. UVA 796 Critical Links —— (求割边(桥))

    和求割点类似,只要把>=改成>即可.这里想解释一下的是,无向图没有重边,怎么可以使得low[v]=dfn[u]呢?只要它们之间再来一个点即可. 总感觉图论要很仔细地想啊- -一不小心就弄混 ...

  6. UVA 796 - Critical Links (求桥)

    Critical Links  In a computer network a link L, which interconnects two servers, is considered criti ...

  7. UVA 796 Critical Links(无向图求桥)

    题目大意:给你一个网络要求这里面的桥. 输入数据: n 个点 点的编号  (与这个点相连的点的个数m)  依次是m个点的   输入到文件结束. 桥输出的时候需要排序   知识汇总: 桥:   无向连通 ...

  8. UVA 796 Critical Links(模板题)(无向图求桥)

    <题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...

  9. UVA 796 - Critical Links 无向图字典序输出桥

    题目:传送门 题意:给你一个无向图,你需要找出里面的桥,并把所有桥按字典序输出 这一道题就是用无向图求桥的模板就可以了. 我一直错就是因为我在输入路径的时候少考虑一点 错误代码+原因: 1 #incl ...

随机推荐

  1. OR查询

    OR查询包含:$or和$in $or可以在多个键中查询任意给定的值:$in可以指定不同类型的条件和值. 查询MasertID小于3或者MasterSort等于3的文档: db.SysCore.find ...

  2. chapter9_3 协同程序实现迭代器

    将循环迭代器视为"生产者-消费者"模式的一种特例:迭代器产生的数据供循环体消费. 因此,用协同程序写迭代器就理所当然了.因为协同程序可以一改传统调用者与被调用者之间的关系. 有了这 ...

  3. padding当高度用时出现的问题

    <div class="wrap"> <div class="sudoku"> <div class="sdk-wrap ...

  4. 纯计算监控(Pure computed observables)

    纯计算监控,在knockout 3.2.0里才有,提供了对性能和内存更好的管理.这是因为纯计算监控不包含对他的依赖的订阅.特点有: 防止内存泄漏 降低计算开销:值不再是observed,是一个不会重新 ...

  5. vs中的各种快捷键

    1. VS注释与取消注释快捷键 CTRL + K , CTRL + C(注释) CTRL + K , CTRL + U(取消注释)

  6. mysql备份并自动压缩命令

    #! /bin/bash mysqldump -uroot -p'password' databasename | gzip > /home/backup/database_`date +%Y% ...

  7. 进入BIOS SHELL DUMP 命令

    LINUX系统 进入SHELL 输入命令 fs1: or fs0: 就进入了U盘目录 然后输入 ACPIRW.efi  -d -s dsdt.bat 就会产生结果到U盘 ——————————————— ...

  8. img转data

    http://blog.csdn.net/lwjok2007/article/details/50756273

  9. 分珠(dfs+并查集)

    1140 分珠 时间限制:500MS  内存限制:65536K提交次数:24 通过次数:18 题型: 编程题   语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不 ...

  10. Hibernate与Sleep的区别

    转自:http://blog.sina.com.cn/s/blog_4b6e98810100n37k.html 休眠(Hibernate),将系统切换到该模式后,系统会自动将内存中的数据全部转存到硬盘 ...