题目传送门

这个题其实就是tarjan缩点的板子题对吧....至少我是这么想的

首先这是个有向图,对于一个有向图,我们肯定要考虑环的存在与否,恰好这个题又是让我们找出最少的点,使得这几个点能够走遍全图

那么,显然,对于每一个强连通分量,我们看做一个点即可(因为强连通分量中每两个点之间一定能从一个点到另一个点,即从一个点出发一定能够走遍整个强连通分量)

缩完点之后,我们得到一个DAG,显然,对于每一个入度为零的点,我们都需要发布消息,其余入度不为零的点都可以通过这些入度为零的点走到

于是,这题就A了

#include <iostream>
#include <cstdlib>
#include <cstdio> using namespace std; const int N=1e5+5;
const int M=5e5+5; struct edge{
int to,next;
}e[M]; int n,m,dfn[N],low[N],cnt,head[N];
int idx[N],s[N],top,tot,sum;
bool ins[N];int ind[N],ans; inline void build(int u,int v){
e[++tot].next=head[u];
head[u]=tot;
e[tot].to=v;
return ;
} inline void tarjan(int cur){
s[++top]=cur;ins[cur]=true;
dfn[cur]=low[cur]=++cnt;
for(int i=head[cur];i;i=e[i].next){
int k=e[i].to;
if(!dfn[k]){
tarjan(k);
low[cur]=min(low[cur],low[k]);
}else if(ins[k]) low[cur]=min(low[cur],dfn[k]);
}
if(low[cur]==dfn[cur]){
++sum;
while(s[top+1]!=cur){
idx[s[top]]=sum;
ins[s[top--]]=false;
}
}
return ;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
register int u,v;
scanf("%d%d",&u,&v);
build(u,v);
}
for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;++i)
for(int j=head[i];j;j=e[j].next){
int k=e[j].to;
if(idx[i]!=idx[k]) ++ind[idx[k]];
}
for(int i=1;i<=sum;++i) if(!ind[i]) ++ans;
printf("%d\n",ans);
return 0;
}

LuoGu P2002 消息扩散的更多相关文章

  1. Luogu P2002 消息扩散&&P1262 间谍网络

    怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...

  2. 【luogu P2002 消息扩散】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2002 缩点把原图变为DAG,再在DAG上判断找入度为0的点的个数. 注意一点出度为0的点的个数不等于入度为0 ...

  3. 洛谷—— P2002 消息扩散

    P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市 ...

  4. P2002 消息扩散(缩点)

    描述:https://www.luogu.com.cn/problem/P2002 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能 ...

  5. 洛谷P2002 消息扩散

    题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n ...

  6. 洛谷 P2002 消息扩散

    题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n ...

  7. P2002 消息扩散[SCC缩点]

    题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入格式 第一行两个整数n,m表示n个城市, ...

  8. tarjan算法比较详细的讲解&&tarjan常见疑难解答&&洛谷P2002 消息扩散题解

    因为有大佬写的比我更长更具体,所以我也就写写总结一下了 引入: 众所周知,很多图中有个东西名叫环. 对于这个东西很多算法都很头疼.(suchas 迪杰斯特拉) 更深层:环属于强联通分量(strongl ...

  9. P2002 消息扩散

    其实这道题蛮水的 思路: 根据题意,他说有环,自然想到要用tarjan,后面就很简单了: 缩完点之后重新建图,开一个inin数组表示该点的入度是多少(psps:该点表示缩完点之后的大点): 最后统计一 ...

随机推荐

  1. sql leetcode -Duplicate Emails

    第一种解法: select distinct p1.Email as Email from Person p1, Person p2 where p1.Email=p2.Email and p1.Id ...

  2. python随机数random模块

    需要  import random x=random.random()    产生 0 到 1 之间的随机浮点数 结果  0.005570080000840916 x=random.randint(1 ...

  3. MySQL安装 8.0.15版本

    windows下MySQL 8.0.15的安装和设置 MySQL下载地址:https://dev.mysql.com/downloads/mysql/ 我的百度网盘下载(win64位):链接:http ...

  4. js的执行环境学习笔记

    js执行全局代码或者执行函数代码的时候,首先进行准备,然后再执行.准备阶段,就是创建执行环境的阶段. 1.执行环境 当一段js代码遇到解释器的时候,比如浏览器打开一段js代码时候,第一件事并不是马上执 ...

  5. luogu P3172 [CQOI2015]选数

    传送门 颓了一小时柿子orz 首先题目要求的是\[\sum_{x_1=l}^{r}\sum_{x_2=l}^{r}...\sum_{x_n=l}^{r}[gcd(x_1,x_2...x_n)=k]\] ...

  6. bash 文件名操作 常用方法

    参考链接: http://www.jb51.net/article/51592.htm 查找文件不获取路径: find $1 -name '*.bin' -exec basename {} \;

  7. linux把文件压缩成.tar.gz的命令

    https://blog.csdn.net/qq_27803491/article/details/52785838

  8. MySql cmd下的学习笔记 —— 有关建立数据库的操作(连接Mysql,建立数据库,删除数据库等等)

    (01) 连接数据库 mysql -uroot -p 之后输入密码 ******.(由于我的密码设置的是111,所以输入的是111) (02) 退出数据库 exit (03) 查看数据库 show d ...

  9. 通过HTTP服务访问FTP服务器文件(配置nginx+ftp服务器)

    1.前提 已安装配置好nginx+ftp服务 2.配置Nginx 服务器 2.1进入nginx 配置文件目录: cd  /usr/local/nginx/conf vi  nginx.conf 2.2 ...

  10. 【Java编程思想笔记】-集合1

    1.为什么要用集合? 一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式.但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来 ...