USACO06JAN The Cow Prom /// tarjan求强联通分量 oj24219
题目大意:
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的更多相关文章
- tarjan求强联通分量
tarjan求强联通分量 变量含义说明: pre[i]:i点的被访问的时钟编号,被分配后保持不变 low[i]:i点能访问的最先的点的时钟编号,随子节点改变 scc_no[i]:i点所在的强联通分量的 ...
- Tarjan求强联通分量+缩点
提到Tarjan算法就不得不提一提Tarjan这位老人家 Robert Tarjan,计算机科学家,以LCA.强连通分量等算法闻名.他拥有丰富的商业工作经验,1985年开始任教于普林斯顿大学.Tarj ...
- tarjan求强联通分量 模板
void tarjan(int u) { dfn[u]=low[u]=++dfs_clock; stack_push(u); for (int c=head[u];c;c=nxt[c]) { int ...
- Tarjan的强联通分量
求强联通分量有很多种. <C++信息学奥赛一本通> 中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...
- tarjan模板 强联通分量+割点+割边
// https://www.cnblogs.com/stxy-ferryman/p/7779347.html ; struct EDGE { int to, nt; }e[N*N]; int hea ...
- Tarjan算法---强联通分量
1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...
- tarjan求双联通分量(割点,割边)
之前一直对tarjan算法的这几种不同应用比较混淆...我太弱啦! 被BLO暴虐滚过来 用tarjan求点双,很多神犇都给出了比较详细的解释和证明,在这里就不讲了(其实是这只蒟蒻根本不会orz) 这里 ...
- 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧
xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...
- POJ 3180-The Cow Prom (图论-有向图强联通tarjan算法)
题目大意:有n个牛在一块, m条单项绳子, 有m个链接关系, 问有多少个团体内部任意两头牛可以相互可达 解题思路:有向图强连通分量模版图 代码如下: #include<stdio.h> # ...
随机推荐
- Sql生成 Insert 语句
declare @TableName sysname select @TableName = 'T_OOSOrder' declare @result varchar(max) = 'INSERT I ...
- SSM框架整合思路
SSM框架整合思路 Spring在整合中起到的作用(面试时常问到) Spring管理持久层的mapper. Spring管理业务层的service,service可以调用mapper接口.Spring ...
- 【Java多线程系列一】Java实现线程方法
Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用 Thr ...
- Java DOM解析器
文档对象模型是万维网联盟(W3C)的官方推荐.它定义了一个接口,使程序能够访问和更新样式,结构和XML文档的内容.支持DOM实现该接口的XML解析器. 何时使用? 在以下几种情况时,应该使用DOM解析 ...
- Centos光盘ISO安装过程再理解
ISO启动时的基本流程 vmlinuz -> 加载initrd.img -> 加载内核基本驱动 -> 挂载光盘至/run/install/repo -> 启动anaconda ...
- windows IIS FTP 不支持创建多级目录
昨天因为这个事情搞了好久,因为客户那边使用的是IIS 上的FTP ,想着都差不多试着运行,结果竟然报错,说"错误550 文件不可用" 是在GetResponse()出现的异常,我用 ...
- Linux 中 sqlite3 基本操作
https://www.runoob.com/sqlite/sqlite-commands.html 一 .linux 下安装数据库和创建一个数据库 1. Linux 下安装sqlite3 需要两个命 ...
- hdu5421 Victor and String 回文树(前后插入)
题目传送门 题意:对一个字符串支持四种操作,前插入字符,后插入字符,询问本质不同的回文串数量和所有回文串的数量. 思路: 就是在普通回文树的基础上,维护suf(最长回文后缀)的同时再维护一个pre(最 ...
- 格式化抽象本地地址(实战linux socket编程)
格式化抽象本地地址传统AF_UNIX套接口名字的麻烦之一就在于总是调用文件系统对象.这不是必须的,而且也不方便.如果原始的文件系统对象并没有删除,而在bind调用时使用相同的文件名,名字赋值就会失败. ...
- vue cli3 vue.config配置
跳地址:https://cli.vuejs.org/zh/config/#publicpath