#define N 100100
#define M 200200 int n,m;
int id,index; //id表示缩点后点的id,index表示进行tarjan算法时访问的点先后
int vis[N],low[N]; //vis表示到当前点的时间,low表示当前所能到达的最小时间.
int stk[N],top; //表示栈
int mark[N];
int link[N]; //将点与缩点后的点相连.
int sum[N]; //强连通分量中点的个数 void dfs(int tarjan_s)
{
vis[tarjan_s]=++index;
low[tarjan_s]=vis[tarjan_s];
stk[top++]=tarjan_s;
mark[tarjan_s]=;
for(int p=pre[tarjan_s];p!=-;p=edge[p].next)
{
int v=edge[p].to;
if(mark[v]==) dfs(v);
if(mark[v]==) low[tarjan_s]=min(low[v],low[tarjan_s]);
}
if(low[tarjan_s]==vis[tarjan_s])//代表找到了一个强连通分量 .
{
id++; //这个强连通的标号
int tarjan_cnt=;
do
{
tarjan_cnt++;
int T_tmp=stk[top-];
mark[T_tmp]=-;
link[T_tmp]=id;
}while(stk[--top]!=tarjan_s);
sum[id]=tarjan_cnt;
}
} void tarjan()
{
memset(mark,,sizeof(mark));
top=; index=; id=;
for(int i=;i<=n;i++)
if(mark[i]==) dfs(i);
}

最新文章

  1. Node.js 教程 01 - 简介、安装及配置
  2. 将jsp页面转化为图片或pdf(一)
  3. [ Arch Linux ] Arch更新源高速源整理之测速并自动排序高速源 加快更新效率
  4. c++ STL中的vector与list为什么没有提供find操作?
  5. Zone.js
  6. Android实例] android获取web服务器端session并验证登陆
  7. lucene4入门(1)
  8. Web开发的绝美网站
  9. 云计算之路-阿里云上:docker swarm 集群再次出现故障
  10. mysql常规巡检
  11. 模拟赛 sutoringu
  12. STM32 Controller area network (bxCAN) Identifier filtering
  13. Struts 2相关配置与基本操作演示(案例Demo)
  14. c++ 容器元素填充指定数量的元素(generate_n)
  15. homewor
  16. 简单版nginx lua 完成定向流量分发策略
  17. 20135234mqy
  18. DataSnap使用UniDac处理自增长字段
  19. Lucene原理之概念
  20. Jquery 批量操作标签属性

热门文章

  1. js 获取select的值 / js动态给select赋值
  2. Git-在一个电脑上同时使用两个Git的账号
  3. selenium2.0 --常用函数2
  4. php面象对象魔术方法的使用
  5. 将Cmder添加到系统右键菜单中
  6. CENTOS 下安装APK反编译工具 APKTOOL
  7. Spring Boot(二):@SpringBootApplication注解理解
  8. container_of学习笔记
  9. linux下时间操作1
  10. 谈一谈APP版本号问题