题目链接:https://vijos.org/p/1023

最近在练强联通分量,当然学的是tarjan算法

而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面

但其实并不是纯粹只需要tarjan求有几个强联通就可以过的(我以为这是所谓的裸题)

其实这题还需要对每一个强联通缩点,可能被所谓裸题误导的OIer们看不破这个

毕竟,这个样例数据也是坑啊,样例数据都可以说是无向图了,哪里还是什么有向图

所以样例数据不是万能的,但是没过样例数据是万万不能的

至于为什么缩点我们来想一想,这张图中,怎么才满足可以被通知到

是在一个强联通分量里面?还是有一条边相连?还是有别的人指向他?

当然可以想到是有人指向他,这样就可以排除求出强联通分量个数的方法。。

不过我们可以确认的是,在一个强联通分量的点,只需要一个点就可以把这个强联通分量通知完,然后我们就可以判断任意两个强联通分量有没有可能有联系,也就是刚刚提到的有没有指向这个强联通分量的其他分量,也就是有没有入度。如果有入度,我们就可以把这个强联通分量与另一个合并,也就是这两个分量只要一个人就可以通知完。由于在这里理解成强联通分量会有些麻烦,所以就是所谓的缩点,把这个强联通分量看成一个点再来找边和入度

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstdlib>
#define maxn 205
using namespace std; struct node{
int u,v,w,nxt;
}e[maxn*maxn]; int head[maxn],dfn[maxn],low[maxn],belong[maxn];
int num,tot,n,m,k,ans,in[maxn],cnt;
stack<int >s; void adde(int u,int v){
e[++tot].u=u;
e[tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
} void tarjan(int u){
num++;
dfn[u]=low[u]=num;
s.push(u);
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].v;
if(dfn[v]==){
tarjan(v);
low[u]=min(low[u],low[v]);
}else{
if(!belong[v])low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
ans++;
belong[u]=ans;
while(s.top()!=u){
belong[s.top()]=ans;
s.pop();
}s.pop();
}
} int main(){
memset(head,-,sizeof(head));
scanf("%d",&n);
for(int i=;i<=n;i++){
int a;scanf("%d",&a);
while(a!=){
adde(i,a);scanf("%d",&a);}
}
for(int i=;i<=n;i++){
if(dfn[i]==)tarjan(i);
}
for(int i=;i<=tot;i++){
int u=e[i].u,v=e[i].v;
if(belong[u]!=belong[v]){
in[belong[v]]++;
}
}
for(int i=;i<=ans;i++){
if(!in[i])cnt++;
}
printf("%d",cnt);
}

【总结】

样例数据是万能的,不能过于相信样例,但是样例错了那就肯定错了

(另外,之前看见有人说原本想并查集但是错了,我个人没有想通为何不能简单的用并查集来偷懒,希望大佬能指点我一番)

[vios1023]维多利亚的舞会3<强联通分量tarjan>的更多相关文章

  1. 强联通分量-tarjan算法

    定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强 ...

  2. POJ 3592 Instantaneous Transference(强联通分量 Tarjan)

    http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...

  3. POJ 3114 Countries in War(强联通分量+Tarjan)

    题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. #include ...

  4. 有向图的强联通分量 Tarjan算法模板

    //白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...

  5. hdu 1269 (强联通分量Tarjan入门)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

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

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

  7. 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点

    题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...

  8. 【强联通分量缩点】【Tarjan】bzoj1051 [HAOI2006]受欢迎的牛

    就是看是否有一些点,从其他任何点出发都可到达 定理:有向无环图中唯一出度为0的点,一定可以由任何点出发均可达. 所以缩点,若出度为零的点(强联通分量)唯一,则答案为该强联通分量中点的度数. 若不唯一, ...

  9. 强联通分量(tarjan算法+算法简介)

    题目描述 ›对于一个有向图顶点的子集S,如果在S内任取两个顶点u和v,都能找到一条从u到v的路径,那么就称S是强连通的.如果在强连通的顶点集合S中加入其他任意顶点集合后,它都不再是强连通的,那么就称S ...

随机推荐

  1. js变量提升、函数提升详解

    一.变量提升是指将变量声明提升到它所在作用域的最开始部分 console.log(a) // 为什么会出现以上的结果,是因为js的变量提升,将a变量的声明提升到全局作用域的最上面部分,实际代码如下: ...

  2. 使用HBuilder开发移动APP

    前言 HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE.HBuilder的编写用到了Java.C.Web和Ruby.HBuilder本身主体是由Java编写,它基于 ...

  3. All In One

    set1 https://github.com/tianhang-f... set2 https://github.com/tianhang/F... set3https://github.com/t ...

  4. Canvas 使用及应用

    Canvas canvas 是 HTML5 当中我最喜欢的所有新特性中我最喜欢的一个标签了.因为它太强大了,各种有意思的特效都可以实现. 1. canvas 的基本使用方法 - 它是一个行内块元素 - ...

  5. Ubuntu16.04下安装nvidia-docker2

    若docker-ce.nvidia.CUDA等都安装完成之后,开启docker服务时,能够正常运行,并有预测结果,那表示服务开启没问题:若都安装成功之后,用docker命令开启服务时,一直报错,可能表 ...

  6. C++ 读取配置文件结束指定进程

    #define _CRT_SECURE_NO_WARNINGS #include <string> #include <windows.h> #include <stdi ...

  7. js中的堆和栈

    http://www.jscwwd.com/article/5e533ae2552a8e2bf45d3d69 这里先说两个概念:1.堆(heap)2.栈(stack)堆 是堆内存的简称.栈 是栈内存的 ...

  8. Hadoop集群搭建(六)~安装JDK

    前面集群的准备工作都做完了,本篇记录安装JDK,版本位1.8 1,在opt目录下创建software和module文件夹:software用来放安装包,module为安装目录 2,把JDK和hadoo ...

  9. Fluent算例精选|03利用VOF和蒸发-冷凝模型

    通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...

  10. Spring框架——IOC 自动装载

    IOC自动装载有两种形式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...