Tarjan 【整理】
Tarjan 【整理】
#include<bits/stdc++.h>
using namespace std;
class FastIO{
/* copyright (c) dgklr 2019. All rights reserved. */
bool if_debug = 0;
char st[70]; // stack
int pl;
#ifdef linux
#define putc(x) putchar_unlocked(x)
#define getc() getchar_unlocked()
#else
#define putc(x) putchar(x)
#define getc() getchar()
#endif
#define endl '\n' // I don't have the authority to get this.
public:
FastIO operator << (long long x){
pl = 0;
if (x == 0) putc('0');
if (x < 0) putc('-');
while (x != 0)
st[++pl] = x % 10 + 48, x /= 10;
while (pl != 0)
putc(st[pl]), pl --;
return (*this);
}
FastIO operator << (int x){
pl = 0;
if (x == 0) putc('0');
if (x < 0) putc('-');
while (x != 0)
st[++pl] = x % 10 + 48, x /= 10;
while (pl != 0)
putc(st[pl]), pl --;
return (*this);
}
FastIO operator << (char c){
putc(c);
return (*this);
}
FastIO operator << (string s){
for (string::iterator it = s.begin(); it != s.end(); it ++)
putc(*it);
}
FastIO operator << (char *c){
int pl = 0;
while (c[pl] != '\0') putc(c[pl++]);
}
template <typename T>
FastIO operator << (vector <T> &a){
putc('[');
typedef typename vector <T> :: iterator Iter;
if (a.begin() == a.end()) putc(']');
else{
(*this) << *a.begin();
for (Iter it = ++a.begin(); it != a.end(); it ++)
(*this) << ", " << *it;
putc(']');
}
}
template <typename T>
FastIO operator << (set <T> &a){
putc('[');
typedef typename set <T> :: iterator Iter;
if (a.begin() == a.end()) putc(']');
else{
(*this) << *a.begin();
for (Iter it = ++a.begin(); it != a.end(); it ++)
(*this) << ", " << *it;
putc(']');
}
}
template <typename S, typename T>
FastIO operator << (map <S, T> &a){
putc('[');
typedef typename map <S, T> :: iterator Iter;
if (a.begin() == a.end()) putc(']');
else{
(*this) << a.begin() -> first << ':' << a.begin() -> second;
for (Iter it = ++a.begin(); it != a.end(); it ++)
(*this) << ", " << it -> first << ':' << it -> second;
putc(']');
}
}
template <typename S, typename T>
FastIO operator << (pair <S, T> &Pt){
putc('<'); (*this) << Pt.first; putc(','); putc(' '); (*this) << Pt.second; putc('>');
}
FastIO operator >> (long long &x){
x = 0;
register char c;
register int w = 1;
while (c = getc(), c < '0' || c > '9') if (c == '-') w = -1;
while (c >= '0' && c <= '9') x = x * 10 + c - 48, c = getc();
return (*this);
}
FastIO operator >> (int &x){
x = 0;
register char c;
register int w = 1;
while (c = getc(), c < '0' || c > '9') if (c == '-') w = -1;
while (c >= '0' && c <= '9') x = x * 10 + c - 48, c = getc();
return (*this);
}
FastIO operator >> (char &c){
c = getc();
return (*this);
}
}IO;
int dfn[101000];
int low[101000];
int n; int m;
vector <int> f[101000]; // edge
stack <int> stk; int pl = 0;
int vis[101000];
int ans[101000];
void dfs(int x){
dfn[x] = low[x] = ++pl;
stk.push(x);
vis[x] = 1;
for (auto i : f[x]){
if (!dfn[i]){
dfs(i);
low[x] = min(low[x], low[i]);
}
else if (vis[i]){
low[x] = min(low[x], dfn[i]);
}
}
if (dfn[x] == low[x]){
while (stk.top() != x){
vis[stk.top()] = 0;
ans[stk.top()] = x;
stk.pop();
}
vis[x] = 0;
ans[x] = x;
stk.pop();
}
}
int main(){
IO >> n >> m;
for (int i=1;i<=m;i++){
int tp1, tp2;
IO >> tp1 >> tp2;
f[tp1].emplace_back(tp2);
}
for (int i=1;i<=n;i++)
{
if (dfn[i] == 0){
dfs(i); // 缩点
}
}
for (int i=1;i<=n;i++)
cout << ans[i] << ' ';
}
Tarjan 【整理】的更多相关文章
- 【学习整理】Tarjan:强连通分量+割点+割边
Tarjan求强连通分量 在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图:一个有向图的极大强联通子图称为强联通分量. 算法可以在 ...
- Tarjan 算法 自学整理
算法介绍 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量( ...
- Tarjan算法整理
众所周知,tarjan是个非常nb的人,他发明了很多nb的算法,tarjan算法就是其中一个,它常用于求解强连通分量,割点和桥等.虽然具体实现的细节不太一样,但是大体思路是差不多的.先来说一下大体思路 ...
- 【模板整理】Tarjan
有向图强连通分量 int tot,low[N],dfn[N],scc[N],sccno; int st[N],top,vis[N]; void tarjan(int u){ int v; low[u] ...
- NOIP模板整理计划
先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include < ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- hdu 4635 Strongly connected(Tarjan)
做完后,看了解题报告,思路是一样的.我就直接粘过来吧 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,同时X部 ...
- tarjan缩点
整理了下模板... #include<iostream> #include<cstdio> #include<cmath> #include<algorith ...
- ACM个人零散知识点整理
ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...
随机推荐
- 小菜鸟之JAVA面试题库1
四次挥手 客户端发送释放连接报文,关闭客户端到服务端的数据传输 服务端收到后,发送确认报文给客户端 服务端发送释放连接报文,关闭服务端到客户端的数据传输 客户端发送一个确认报文给服务端 ------- ...
- # log对数Hash映射优化
log对数Hash映射优化 利用了一个数学技巧:$\forall k \in [0,35],2^{k} mod 37 互不相等,且恰好取遍整数1-36 $ 应用:将int范围内的\(2^k映射到k\) ...
- Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)
Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...
- Hive 教程(七)-DML基础
DML,Hive Data Manipulation Language,数据操作语言: 通俗理解就是数据库里与数据的操作,如增删改查,统计汇总等: Loading files into tables ...
- L2-014. 列车调度(Dilworth定理)
火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道进入,最后从出口 ...
- 使用Keras基于RCNN类模型的卫星/遥感地图图像语义分割
遥感数据集 1. UC Merced Land-Use Data Set 图像像素大小为256*256,总包含21类场景图像,每一类有100张,共2100张. http://weegee.vision ...
- selenium与页面交互
selenium提供了许多API方法与页面进行交互,如点击.键盘输入.打开关闭网页.输入文字等. 一.webdriver对浏览器提供了很多属性来对浏览器进行操作,常用的如图: get(url).qui ...
- java中内部类
package com.xt.instanceoftest; import com.xt.instanceoftest.Body.Heart; public class StaticInnerClas ...
- Keepalived+Nginx+Tomcat 实现高可用Web集群
https://www.jianshu.com/p/bc34f9101c5e Keepalived+Nginx+Tomcat 实现高可用Web集群 0.3912018.01.08 20:28:59字数 ...
- Axure(一)
axure1.原型工具 2.软件开发 1.可行性分析2.需求分析 产品经理(和甲方对接需求,) 乙方 -- 甲方 ps(专业性强,精美) 设计师 html(可变 ...