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 【整理】的更多相关文章

  1. 【学习整理】Tarjan:强连通分量+割点+割边

    Tarjan求强连通分量 在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图:一个有向图的极大强联通子图称为强联通分量.   算法可以在 ...

  2. Tarjan 算法 自学整理

    算法介绍 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量( ...

  3. Tarjan算法整理

    众所周知,tarjan是个非常nb的人,他发明了很多nb的算法,tarjan算法就是其中一个,它常用于求解强连通分量,割点和桥等.虽然具体实现的细节不太一样,但是大体思路是差不多的.先来说一下大体思路 ...

  4. 【模板整理】Tarjan

    有向图强连通分量 int tot,low[N],dfn[N],scc[N],sccno; int st[N],top,vis[N]; void tarjan(int u){ int v; low[u] ...

  5. NOIP模板整理计划

    先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include < ...

  6. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  7. hdu 4635 Strongly connected(Tarjan)

    做完后,看了解题报告,思路是一样的.我就直接粘过来吧 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,同时X部 ...

  8. tarjan缩点

    整理了下模板... #include<iostream> #include<cstdio> #include<cmath> #include<algorith ...

  9. ACM个人零散知识点整理

    ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...

随机推荐

  1. Git及码云学习总结

    前言 一.Git是一个版本管理工具软件. 二.windows 系统的使用: 1.git软件的安装:https://git-scm.com/downloads mac系统是自带的不用安装 windows ...

  2. GridView中点击某行的任意位置就选中该行

    GridView中点击某行的任意位置就选中该行 -- :: 分类: 第一步:添加选择列 点击GridView右边小尖头,双击CommandField,选中"选择",添加,将起设置为不可见: 第二步:处 ...

  3. log4j2配置文件xml详细了解

    log4j2配置文件xml详细了解 详细参考:https://www.cnblogs.com/new-life/p/9246143.html log4j 2.x版本不再支持像1.x中的.propert ...

  4. 1.css选择器

    1.引入外部样式表的格式: <link rel=”stylesheet” type=”text/css” href=”../css/style1.css”> 2.样式表第一行应注明编码类型 ...

  5. java中的Enum在@RestController(@ResponseBody) 注解下返回的表现

    参考文档 枚举 public enum CouponType { PLATFORM("平台优惠券"), NEWCOMER("新人专享优惠券"), INVITE( ...

  6. mysoft

    @@a8649fbb56349908b5ca6708fb94b3ddabcf6b97381a9797d3dfb139b8749287117@@##74e02e1207e5a0a8996ba89f1d6 ...

  7. 在centos7上kvm网卡桥接

    系统环境准备 [root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@linux-node1 ~ ...

  8. centos 7 SVN安装脚本搭建主从同步灵活切换

    svn 脚本下载 http://opensource.wandisco.com/subversion_installer_1.9.sh 2019-Aug-20 12:20:4810.1Kapplica ...

  9. C语言 STL中qsort用法

    qsort函数包含在<stdlib.h>的头文件里. qsort函数声明如下:void qsort(void *base, size_t nmemb, size_t size, int(* ...

  10. 构建一个highcharts

    示例:http://www.helloweba.com/demo/highcharts/line.html <!doctype html> <html lang="en&q ...