题目大意:

n个点 m条边的图 求大小大于1的强联通分量的个数

https://www.cnblogs.com/stxy-ferryman/p/7779347.html

tarjan求完强联通分量并染色后

计算一下每种颜色的个数 就是每个强联通块的大小

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std; const int N=;
struct EDGE { int to, nt; }e[*N];
int head[N], tot;
int dfn[N], low[N], ind;
int col[N], id;
bool vis[N];
stack <int> s; int n, m, cnt[N]; void init() {
while(!s.empty()) s.pop();
for(int i=;i<=n;i++) {
head[i]=dfn[i]=low[i]=col[i]=-;
vis[i]=cnt[i]=;
}
tot=ind=id=;
}
void addE(int u,int v) {
e[tot].to=v;
e[tot].nt=head[u];
head[u]=tot++;
} void tarjan(int u) {
dfn[u]=low[u]=ind++;
s.push(u); vis[u]=;
for(int i=head[u];i!=-;i=e[i].nt) {
int v=e[i].to;
if(dfn[v]==-) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else {
if(vis[v]) low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]) {
col[u]=++id;
vis[u]=;
while(s.top()!=u) {
col[s.top()]=id;
vis[s.top()]=;
s.pop();
} s.pop();
}
} int main()
{
while(~scanf("%d%d",&n,&m)) {
init();
for(int i=;i<=m;i++) {
int u,v;
scanf("%d%d",&u,&v);
addE(u,v);
}
for(int i=;i<=n;i++)
if(dfn[i]==-) tarjan(i);
for(int i=;i<=n;i++)
cnt[col[i]]++;
int ans=;
for(int i=;i<=id;i++)
if(cnt[i]>) ans++;
printf("%d\n",ans);
} return ;
}

USACO06JAN The Cow Prom /// tarjan求强联通分量 oj24219的更多相关文章

  1. tarjan求强联通分量

    tarjan求强联通分量 变量含义说明: pre[i]:i点的被访问的时钟编号,被分配后保持不变 low[i]:i点能访问的最先的点的时钟编号,随子节点改变 scc_no[i]:i点所在的强联通分量的 ...

  2. Tarjan求强联通分量+缩点

    提到Tarjan算法就不得不提一提Tarjan这位老人家 Robert Tarjan,计算机科学家,以LCA.强连通分量等算法闻名.他拥有丰富的商业工作经验,1985年开始任教于普林斯顿大学.Tarj ...

  3. tarjan求强联通分量 模板

    void tarjan(int u) { dfn[u]=low[u]=++dfs_clock; stack_push(u); for (int c=head[u];c;c=nxt[c]) { int ...

  4. Tarjan的强联通分量

    求强联通分量有很多种. <C++信息学奥赛一本通>  中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...

  5. tarjan模板 强联通分量+割点+割边

    // https://www.cnblogs.com/stxy-ferryman/p/7779347.html ; struct EDGE { int to, nt; }e[N*N]; int hea ...

  6. Tarjan算法---强联通分量

    1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...

  7. tarjan求双联通分量(割点,割边)

    之前一直对tarjan算法的这几种不同应用比较混淆...我太弱啦! 被BLO暴虐滚过来 用tarjan求点双,很多神犇都给出了比较详细的解释和证明,在这里就不讲了(其实是这只蒟蒻根本不会orz) 这里 ...

  8. 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧

    xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...

  9. POJ 3180-The Cow Prom (图论-有向图强联通tarjan算法)

    题目大意:有n个牛在一块, m条单项绳子, 有m个链接关系, 问有多少个团体内部任意两头牛可以相互可达 解题思路:有向图强连通分量模版图 代码如下: #include<stdio.h> # ...

随机推荐

  1. 如何在普通用户权限cmd怎么使用命令行变为管理员权限

    这两天在弄MySql,由于我下载的是免安装版本,环境自己配置了一下.有强迫症不喜欢某些服务打开在我不需要的时候,我一般都设置为手动,但是每次使用数据库时都要使用net start mysql启动MyS ...

  2. linux进阶之路(一):linux入门

    Linux:开源.免费得开源系统.具有高效性.稳定性.安全性.处理多并发. Linux的发行版本:基于Linux,不同的安装软件 CentOS(RedHat开源版本) RedHat Ubuntu Su ...

  3. Java获取CPU占用率

    原文链接:https://www.jianshu.com/p/015cc4805e29 最近做一个Java性能统计的问题,需要统计当前进程占用CPU的情况,最开始使用Java MxBean来获取 Op ...

  4. 引入scss(@import)和其中易错点

    1.引入文件方式 @import 'url'; ./ :当前目录 ../ :上级目录 src/api/styles: 绝对路径 2.一般在main.js中引用当做全局样式 import 'styles ...

  5. webpack中引用Element-ui

    1.下载element-ui npm i element-ui --production 2.在main.js中引用 import Element from 'element-ui' import ' ...

  6. 实用的CSS3-渐变背景色

    线性渐变背景色:     第一个参数为渐变方式,后两个参数为起始点位置和终止点位置,后两个参数为起始颜色和终止颜色,后面那个参数为背景区域padding表示包含padding的区域,content表示 ...

  7. Java 并发理论简述

    一:为什么需要多线程? 线程是Java语言中不可或缺的重要部分,它们能使复杂的异步代码变得简单,简化复杂系统的开发:能充分发挥多处理器系统的强大计算能力.多线程和多进程的区别与选择可以参考我的另一篇博 ...

  8. WSGI是什么?

    WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...

  9. js 点击获取验证码后的倒数60s

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script ...

  10. docker容器和宿主机时间不一致的问题

    第1种:复制宿主机的localtime文件,到容器里docker cp /etc/localtime threg:/etc/ 注:这里 threg为容器名称,复制完后需重启容器 第2种在构建docke ...