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& ...
随机推荐
- 纯前端表格控件SpreadJS以专注业务、提升效率赢得用户与市场
提起华为2012实验室,你可能有点陌生. 但你一定还对前段时间华为的那封<海思总裁致员工的一封信>记忆犹新,就在那篇饱含深情的信中,我们知道了华为为确保公司大部分产品的战略安全和连续供应, ...
- Windows本地运行调试Spark或Hadoop程序失败:ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
报错内容 ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path java.io.IOExce ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- acmsguru
acmsguru 101 - Domino 要求每两个相邻的多尼诺骨牌相对的数字相同,即做一个一笔画 #include<bits/stdc++.h> using namespace std ...
- Java中创建的对象多了,必然影响内存和性能
1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.
- angular 4+中关于父子组件传值的示例
home.component.ts import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-hom ...
- 富文本编辑器--获取JSON
获取 JSON 格式的内容 可以通过editor.txt.getJSON获取 JSON 格式的编辑器的内容,v3.0.14开始支持,示例如下 <div id="div1"&g ...
- jQuery 遍历 - 后代
向下遍历 DOM 树 下面是两个用于向下遍历 DOM 树的 jQuery 方法: children() find() jQuery children() 方法 children() 方法返回被选元素的 ...
- 让IE6、IE7、IE8、IE9、IE10、IE11支持Bootstrap的解决方法
最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没 ...
- jquery 知识整理
大纲一.jQuery简介 二.jQuery 和Dom关系及jQuery版本 1.jQuery版本 2.jQuery和Dom转换 三.jQuery 选择器 1.1.基本 1.2.层级 2.基本筛选器 3 ...