Tarjan模板题——牛的舞会
题目描述
约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞.
只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一个圆形的水池.奶牛们围在池边站好, 顺时针顺序由1到N编号.每只奶牛都面对水池,这样她就能看到其他的每一只奶牛.
为了跳这种圆舞,她们找了 M(2<M< 50000)条绳索.若干只奶牛的蹄上握着绳索的一端, 绳索沿顺时针方绕过水池,另一端则捆在另一些奶牛身上.这样,一些奶牛就可以牵引另一些奶 牛.有的奶牛可能握有很多绳索,也有的奶牛可能一条绳索都没有.
对于一只奶牛,比如说贝茜,她的圆舞跳得是否成功,可以这样检验:沿着她牵引的绳索, 找到她牵引的奶牛,再沿着这只奶牛牵引的绳索,又找到一只被牵引的奶牛,如此下去,若最终 能回到贝茜,则她的圆舞跳得成功,因为这一个环上的奶牛可以逆时针牵引而跳起旋转的圆舞. 如果这样的检验无法完成,那她的圆舞是不成功的.
如果两只成功跳圆舞的奶牛有绳索相连,那她们可以同属一个组合.
给出每一条绳索的描述,请找出,成功跳了圆舞的奶牛有多少个组合?
输入输出格式
输入格式:
Line 1: Two space-separated integers: N and M
Lines 2..M+1: Each line contains two space-separated integers A and B that describe a rope from cow A to cow B in the clockwise direction.
输出格式:
Line 1: A single line with a single integer that is the number of groups successfully dancing the Round Dance.
输入输出样例
输入:
5 4
2 4
3 5
1 2
4 1
输出:
1
这道题思路还是很简单的 一个裸的tarjan强连通分量 在这里还是着重解释一下tarjan,代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100010
int n,m;
int cnt;//记录强连通分量的个数
int vis_num;//遍历的步数
int dfn[maxn];//记录元素第一次被访问的步数
int low[maxn];//包含i的强连通分量最早被访问的步数
int num[maxn];//记录强连通分量里的点的个数
int belong[maxn];//i从属的强连通分量
int top;//栈中元素的个数
int stack[maxn];//手打栈
int instack[maxn];//判断元素是否在栈中
int head[maxn];
struct node//链式前向星存边
{
int to,nex;
}edge[maxn];
inline int read()//读入优化
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
void tarjan(int);
int main()
{
int ans=;
int p,q;
n=read();m=read();
for(int i=;i<=m;i++)
{
p=read();q=read();
edge[i].to=q;
edge[i].nex=head[p];
head[p]=i;
}
for(int i=;i<=n;i++)
{
if(!dfn[i])//i没被访问过了
{
tarjan(i);
}
}
for(int i=;i<=cnt;i++)
{
if(num[i]>)
{
ans++;
}
}
printf("%d\n",ans);
return ;
}
void tarjan(int u)
{
int v;
vis_num++;
dfn[u]=low[u]=vis_num;
stack[++top]=u;//入栈
instack[u]=;//入栈
for(int i=head[u];i;i=edge[i].nex)
{
v=edge[i].to;//下一个访问的点
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);//判断u是否为v的子节点
}
else if(instack[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])//u为强连通分量的根
{
cnt++;//强连通分量的个数+1
do//退栈
{
num[cnt]++;
v=stack[top--];
belong[v]=cnt;
instack[v]=;
}while(u!=v);
}
}
这里的belong数组似乎没有什么用,但很多tarjan题目里需要用到belong,这里讲解tarjan代码就放了上来。
注释里有说的,编号i所属的强连通分量编号,但对于此题没有用
belong[100010];//i从属的强联通分量的序号
Tarjan模板题——牛的舞会的更多相关文章
- POJ 2186:Popular Cows Tarjan模板题
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25945 Accepted: 10612 De ...
- UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题
http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using nam ...
- 【HDOJ 1269】迷宫城堡(tarjan模板题)
Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若 ...
- 1506 传话 (暴力DFS或者Tarjan模板题)
题目描述 Description 一个朋友网络,如果a认识b,那么如果a第一次收到某个消息,那么会把这个消息传给b,以及所有a认识的人. 如果a认识b,b不一定认识a. 所有人从1到n编号,给出所有“ ...
- LuoGu-P2863牛的舞会The Cow Prom[tarjan 缩点模板]
传送门:https://www.luogu.org/problemnew/show/P2863 思路:tarjan模板题,之前会的tarjan,一直想学缩点到底是什么操作,发现就是把同组的放在一个数组 ...
- hdu 2586 How far away ?(LCA - Tarjan算法 离线 模板题)
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- [USACO06JAN] 牛的舞会 The Cow Prom
题目描述 The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their ...
- 洛谷2863 [Usaco06JAN]牛的舞会
题目描述 约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞. 只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一 ...
- 洛谷1726 上白泽慧音 tarjan模板
题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...
随机推荐
- AtCoder Beginner Contest 044 C - 高橋君とカード / Tak and Cards
题目链接:http://abc044.contest.atcoder.jp/tasks/arc060_a Time limit : 2sec / Memory limit : 256MB Score ...
- [转载]drop、truncate和delete的区别
原文出处:http://blog.csdn.net/ws0513/article/details/49980547 (1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作 ...
- 第一节 JavaScript概述
第一节 JavaScript概述 JavaScript:其实就是对HTML+CSS静态页面进行样式修改,使其实现各种动态效果. 编写JS脚本基本步骤: 1. HTML+CSS静态布局: 2. 确定要修 ...
- 【视频】使用fiddler开发工具进行新架构页面本地调试
[视频]使用fiddler开发工具进行新架构页面本地调试,视频没录制好,有些部分比较模糊...
- webVR框架A-frame
A-frame:https://blog.csdn.net/sun124608666/article/details/77869570 three.js学习文档:http://www.hewebgl. ...
- spring(读取外部数据库配置信息、基于注解管理bean、DI)
###解析外部配置文件在resources文件夹下,新建db.properties(和数据库连接相关的信息) driverClassName=com.mysql.jdbc.Driverurl=jdbc ...
- AirTest源码分析之运行器
from: https://blog.csdn.net/u012897401/article/details/82900562 使用:根据airtest文档说明,可以通过命令行来启动air脚本,需要传 ...
- php+js的 authcode 混淆加密和解密,php和js可以通用加密和解密
<script> //md5.js var hexcase = 0; function hex_md5(a) { return rstr2hex(rstr_md5(str2rstr_utf ...
- 利用JQuery Mobile开发web app
什么是web app web app 是基于web的应用程序,是针对移动设备优化后的web站点,它具有 开发成本低——采用web开发技术,不需要考虑跨平台以及底层适配问题: 升级简单——不需要通知用户 ...
- nginx 下 php 无法执行,虚拟主机 无法使用
检查目录下的.ini文件 有可能是因为多了个user.ini文件.这个文件在linux下可用,在window下不可用. windows下删掉这个文件后记得重启一下nginx.不然不会生效. 参考:ht ...