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& ...
随机推荐
- 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制
当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...
- 卸载mysql后再安装提示The service already exists!问题解决方法
卸载mysql后再安装输入mysqld --install 回车后提示The service already exists! 原因:卸载的时候没有卸载干净 方法: 一.重新以管理员身份打开cmd 二. ...
- python 运算和流程控制
写在之前 今天突发奇想,想要弄一个微信自动抢红包的程序,首先去百度这个,找到了有两种方法 一种是安装「pocoui」这个第三方库,但没有给出详细代,我就没有使用这个方法. 我用使用的是第二种借助「Ai ...
- JVM 线上故障排查基本操作 (转)
前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的.各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该如何 ...
- org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set. Authorization cache cannot be obtained.
项目中用spring shiro来处理权限的问题,但是启动的时候会打印如下日志 org.apache.shiro.realm.AuthorizingRealm - No cache or cacheM ...
- pytorch中torch.narrow()函数
torch.narrow(input, dim, start, length) → Tensor Returns a new tensor that is a narrowed version of ...
- O013、动手实践Linux VLAN
参考https://www.cnblogs.com/CloudMan6/p/5326737.html 本节我们来看如何在实验环境中实施和部署如下的VLAN 网络
- JRebel最新破解激活版(IDEA自动部署插件)
参考: https://www.52pojie.cn/thread-906163-1-1.html https://blog.csdn.net/xingbaozhen1210/article/deta ...
- Linux内核管理子系统和进程管理子系统
内核管理子系统职能:1.管理虚拟地址与物理地址的映射 2.物理内存的分配 程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 进程:是一个执行中的程序,它是动态的实体 进程四要素: ...
- fiddler获取响应时间以及服务器IP
抓包工具fiddler实现http协议请求应答抓包.在接口测试.性能测试.安全测试等软件测试活动过程中,可能会遇到需要获取接口响应时间.接口服务器IP这样的情况.默认情况下fiddler不支持接口响应 ...