uva796(求桥数目)
传送门:Critical Links
题意:给出一个无向图,按顺序输出桥。
分析:模板题,求出桥后排个序输出。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 10010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
struct edge
{
int v,next;
edge(){}
edge(int v,int next):v(v),next(next){}
}e[N<<];
struct bridge
{
int u,v;
bridge(){}
bridge(int u,int v):u(u),v(v){}
bool operator<(const bridge &a)const{
if(u==a.u)return v<a.v;
return u<a.u;
}
}b[N<<];
int n,step,top,tot,num;
int head[N],dfn[N],low[N],Stack[N];
bool instack[N],vis[N<<];
map<int,int>mp;
void init()
{
tot=;step=;top=;num=;
FILL(head,-);FILL(dfn,);
FILL(low,);FILL(instack,false);
FILL(vis,);mp.clear();
}
bool isHash(int u,int v)
{
if(mp[u*N+v])return ;
if(mp[v*N+u])return ;
mp[u*N+v]=mp[v*N+u]=;
return ;
}
void addedge(int u,int v)
{
e[tot]=edge(v,head[u]);
head[u]=tot++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++step;
Stack[top++]=u;
instack[u]=true;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].v;
if(vis[i])continue;
vis[i]=vis[i^]=;
if(!dfn[v])
{
tarjan(v);
if(low[u]>low[v])low[u]=low[v];
//桥:一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFS[u]<Low[v]
if(low[v]>dfn[u])
{
b[num++]=bridge(min(u,v),max(u,v));
}
}
else if(low[u]>dfn[v])
{
low[u]=dfn[v];
}
}
instack[u]=false;
top--;
}
void solve()
{
for(int i=;i<n;i++)
if(!dfn[i])tarjan(i);
sort(b,b+num);
printf("%d critical links\n",num);
for(int i=;i<num;i++)
printf("%d - %d\n",b[i].u,b[i].v);
puts("");
}
int main()
{
int u,v;
while(scanf("%d",&n)>)
{
init();
for(int i=;i<=n;i++)
{
int t,u,v;
scanf("%d (%d)",&u,&t);
while(t--)
{
scanf("%d",&v);
if(!isHash(u,v))
{
addedge(u,v);
addedge(v,u);
} }
}
solve();
}
}
uva796(求桥数目)的更多相关文章
- UVA796 Critical Links(求桥) 题解
题意:求桥 思路:求桥的条件是:(u,v)是父子边时 low[v]>dfn[u] 所以我们要解决的问题是怎么判断u,v是父子边(也叫树枝边).我们在进行dfs的时候,要加入一个fa表示当前进行搜 ...
- tarjan算法求桥双连通分量 POJ 3177 Redundant Paths
POJ 3177 Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12598 Accept ...
- HDU 4738--Caocao's Bridges(重边无向图求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- tarjan求桥、割顶
若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...
- 【HDU4612】 双连通分量求桥
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:给你一个无向图,问你加一条边后最少还剩下多少多少割边. 解题思路:好水的一道模板题.先 ...
- POJ 2528 区间染色,求染色数目,离散化
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 47905 Accepted: 13903 ...
- uva 796 Critical Links(无向图求桥)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- hdu 3849 (双联通求桥)
一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...
- hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...
随机推荐
- poj 3466 A Simple Problem with Integers
题目链接:http://poj.org/problem?id=3468 http://poj.org/problem?id=3468 http://poj.org/problem?id=3468 思路 ...
- 事务管理在三层架构中应用以及使用ThreadLocal再次重构
本篇将详细讲解如何正确地在实际开发中编写事务处理操作,以及在事务处理的过程中使用ThreadLocal的方法. 在前面两篇博客中已经详细地介绍和学习了DbUtils这个Apache的工具类,那么在本篇 ...
- js数组基础整理
首页: 主要整理了一下数组中常用的一些基础知识,代码都是自己手敲,有不对的地方希望能指出,目前只有4篇,后续会不断的增加这一板块. 由于少于100字不能发所以把一些最基本的创建数组也写上. // 创建 ...
- php调用dll
http://download.csdn.net/detail/pinghe2005/5108556
- perl 改变对象属性
[root@wx03 test]# cat Critter.pm package Critter; #unshift(@INC,"/root/test"); #use messag ...
- JQuery Ajax实例总结
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...
- Kendo UI开发教程(21): Kendo MVVM 数据绑定(十) Source
Source绑定可以把ViewModel的值和由Kendo模板定义的目标元素绑定,如果ViewModel的值发生变化,被绑定的目标元素也随之发生变化.模板由属性data-template指定,它的值为 ...
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)
之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...
- 轻应用 lapp
轻应用 LAPP (Light App) 即轻应用是一种无需下载.即搜即用的全功能 App,既有媲美甚至超越native app的用户体验,又具备webapp的可被检索与智能分发的特性,将有效解决优质 ...
- c/c++ 动态申请数组
new和delete运算符用于动态分配和撤销内存的运算符 new使用方法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.in ...