51nod1076(tarjan)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1076
题意:中文题诶~
思路:先用tarjan找出所有桥,再用桥限制的情况下dfs一遍。。。
代码:
#include <bits/stdc++.h>
using namespace std; const int MAXN=1e5+;
vector<int> mp[MAXN];
bool is_cut[MAXN];
int n, m, ans=;
int vis[MAXN];
int low[MAXN], dfn[MAXN], pre[MAXN];//pre[u]记录u的父亲节点编号
//dfn[u]记录节点u在DFS过程中被遍历到的次序号,low[u]记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次序号最小 void tarjan(int u, int fu){
pre[u]=fu;//记录当前u的父亲节点
dfn[u]=low[u]=++ans;
for(int i=; i<mp[u].size(); i++){
int v=mp[u][i];
if(!dfn[v]){
tarjan(v, u);
low[u]=min(low[u], low[v]);//先是得到一颗dfs树,回溯过程即後序遍历此dfs树,此时low[v]已經得到,因此可以通過low[v]來更新low[u]
}else if(fu!=v){//如果v是u的父亲的话,即有重边,那么不可能是桥
low[u]=min(low[u], dfn[v]);
}
}
} void dfs(int x, int cnt){
vis[x]=cnt;
for(int i=; i<mp[x].size(); i++){
int v=mp[x][i];
if(vis[v]||is_cut[v]&&is_cut[x]) continue;
dfs(v, cnt);
}
} void solve(void){
for(int i=; i<=n; i++){
if(!dfn[i]) tarjan(i, );
int v=pre[i];
if(dfn[v]<low[i]&&v>){
is_cut[i]=is_cut[v]=;
}
}
int cnt=;
for(int i=; i<=n; i++){
if(!vis[i]){
cnt++;
dfs(i, cnt);
}
}
} int main(void){
scanf("%d%d", &n, &m);
for(int i=; i<m; i++){
int x, y;
scanf("%d%d", &x, &y);
mp[x].push_back(y);
mp[y].push_back(x);
}
solve();
int q;
scanf("%d", &q);
while(q--){
int s, e;
scanf("%d%d", &s, &e);
if(vis[s]==vis[e]) puts("Yes");
else puts("No");
}
return ;
}
51nod1076(tarjan)的更多相关文章
- HDU4738 tarjan割边|割边、割点模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- tarjan讲解(用codevs1332(tarjan的裸题)讲解)
主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...
- NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- Tarjan
//求强连通分量 void uni(int x,int y){ if (rank[x]<rank[y]){ fa[x]=y; size[y]+=size[x]; }else{ rank[x]+= ...
- 【UOJ#67】新年的毒瘤 Tarjan 割点
#67. 新年的毒瘤 UOJ直接黏贴会炸... 还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...
- 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分
E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...
- 【BZOJ-1123】BLO Tarjan 点双连通分量
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 970 Solved: 408[Submit][Status][ ...
- 【BZOJ-2730】矿场搭建 Tarjan 双连通分量
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1602 Solved: 751[Submit][Statu ...
随机推荐
- switch多分枝语句
package lianxi; //switch多分枝语句 import java.util.Scanner; public class GetSwitch { public static void ...
- httpclient4 模拟访问网页 模拟登录 简单例子
JAVA后台模拟登录一个网站,获得一定权限后进一步操作. 所用的工具: Apache HttpComponents client 4.3版本 以下为代码: import org.apache.http ...
- SpringBoot-(1)-IDEA创建SpringBoot项目并运行访问接口
一,安装IDEA mac安装IDEA IDEA配置Tomcat 二,创建SpringBoot项目 1,打开IDEA,点击Create New Project 2,选择自己所安装的JDK.如果没有配置J ...
- appium(4)-Automating mobile web apps
Automating mobile web apps If you’re interested in automating your web app in Mobile Safari on iOS o ...
- Break、Continue、Return区别
1)break 直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试.他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来 ...
- CORS 理解(不要那么多术语)
摘要 谈到跨域,不论前端还是后端,多少有点谈虎色变,面试中也常会问到这些问题,浏览器和服务器端到底怎么做才能跨域,他们都做了什么? 同源 vs 跨域 同源,字面意义是相同的源头,即同一个web服务器( ...
- raise 与 raise ... from 的区别
起步 Python 的 raise 和 raise from 之间的区别是什么? try: print(1 / 0) except Exception as exc: raise RuntimeErr ...
- 理解HTML解析过程
浏览器解析html的过程是:接受网络数据->将二进制码变成字符->将字符变为unicode code points.->tokenizer ->tree constructor ...
- javabean学习
javabean是一种可重复使用且跨平台的软件组件.他可以分为:客户界面组件(UI,user interface)和没有用户界面,主要负责处理事务(如,数据处理.操作数据库等)地javabean ja ...
- 【转载】String和StringBuffer的区别,以及StringBuffer的常用方法介绍
String与StringBuffer的区别简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象.Stri ...