Tarjan缩点【模板】
2024-09-04 11:04:59
#include <algorithm>
#include <cstdio>
#include <map> using namespace std; const int N();
map<int,bool>Map[N];
int n,m,v,u;
int edgesum,head[N];
int edgesum2,head2[N]; struct Edge
{
int from,to,next;
Edge(int from=,int to=,int next=) :
from(from),to(to),next(next) {}
}edge[N],edge2[N];
int ins(int from,int to)
{
edge[++edgesum]=Edge(from,to,head[from]);
return head[from]=edgesum;
} int ins2(int from,int to)
{
edge2[++edgesum2]=Edge(from,to,head2[from]);
return head2[from]=edgesum2;
} int dfn[N],tim,low[N],vis[N];
int Stack[N],top,instack[N];
int col[N],colsum; void DFS(int now)
{
dfn[now]=low[now]=++tim; vis[now]=;
Stack[++top]=now; instack[now]=;
for(int i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
if(instack[to]) low[i]=min(low[i],dfn[to]);
else if(!vis[to])
DFS(to),low[i]=min(low[i],low[to]);
}
if(low[now]==dfn[now])
{
colsum++;
col[now]=colsum;
for(;Stack[top]!=now;top--)
{
col[Stack[top]]=colsum;
instack[Stack[top]]=;
}
instack[now]=;
top--;
}
} int main()
{
scanf("%d%d",&n,&m);
for(;m--;)
{
scanf("%d%d",&u,&v);
ins(u,v);
}
for(int i=;i<=n;i++)
if(!vis[i]) DFS(i);
for(int i=;i<=n;i++)
for(int u=head[i];u;u=edge[i].next)
{
int v=edge[i].to;
if(col[i]!=col[v])
if(Map[col[i]].find(col[v])==Map[col[i]].end())
{
Map[col[i]][col[v]]=;
ins2(col[i],col[v]);
}
}
return ;
}
最新文章
- android.graphic.Path
- 关于一个程序的编译过程 zkjg面试
- qml 封装技巧-利用数据来进行适配
- SQL Server AlwaysOn架构及原理
- MJRefreshFooterView
- 自编的CHtmlView浏览器,怎么截获超连接,不让新窗口在IE中打开
- tyvj P1519 博彩游戏(AC自动机+DP滚动数组)
- (转载)Linux系统调用及用户编程接口(API)
- Nginx学习笔记二基本配置
- Java 多线程(二) 线程的实现
- DataLoad命令
- HDOJ5543 Pick The Sticks
- 玩转spring boot——负载均衡与session共享
- Delphi TXLSReadWriteII导出Excel
- [No0000146]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈3/4
- 【LeetCode】大数相乘
- 转-[WebServer] Windows操作系统下 Tomcat 服务器运行 PHP 的环境配置
- Create a Basic Shader in Shader Forge
- 后台判断ajax请求的请求后字段
- Word域介绍文章