P2002 消息扩散
其实这道题蛮水的
思路:
根据题意,他说有环,自然想到要用tarjan,后面就很简单了;
缩完点之后重新建图,开一个inin数组表示该点的入度是多少(psps:该点表示缩完点之后的大点);
最后统计一下那个点没有入度就好了;
下面是本蒟蒻的cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
#define maxn 10101110
stack<int>q;
struct Node
{
int next,to;
}e[maxn],ee[maxn];
int dfn[maxn],low[maxn],be[maxn];
int vis[maxn],in[maxn],headd[maxn];
int n,m,num,num1,ans,head[maxn];
//num1表示大点的个数,num表示tarjan中的编号
//head原图,e->原图;ee->新图 headd->新图
void add(int x,int y)
{
e[++head[]].next=head[x];
e[head[]].to=y;
head[x]=head[];
}
void ad(int x,int y)
{
ee[++headd[]].next=headd[x];
ee[headd[]].to=y;
headd[x]=headd[];
}
//这里我用的head[0],headd[0]表示是为了节省一个小小的空间
void tarjan(int x)
{
vis[x]=;q.push(x);
dfn[x]=low[x]=++num;
for(int i=head[x];i;i=e[i].next)
{
int t=e[i].to;
if(!dfn[t])
{
tarjan(t);
low[x]=min(low[x],low[t]);
}
else if(vis[t])
low[x]=min(low[t],low[x]);
}
if(dfn[x]==low[x])
{
vis[x]=;
be[x]=++num1;
while(q.top()!=x)
{
be[q.top()]=num1;
vis[q.top()]=;
q.pop();
}
be[q.top()]=num1;
vis[q.top()]=;
q.pop();
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int y,u;
scanf("%d%d",&y,&u);
add(y,u);
}//加边
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n;i++)
for(int j=head[i];j;j=e[j].next)
if(be[i]!=be[e[j].to])
{
ad(be[i],be[e[j].to]);
in[be[e[j].to]]++;
//加新边同时记in
}
for(int i=;i<=num1;i++)
if(!in[i])
ans++;
printf("%d",ans);
return ;
}
P2002 消息扩散的更多相关文章
- Luogu P2002 消息扩散&&P1262 间谍网络
怕自己太久没写Tarjan了就会把这种神仙算法忘掉. 其实这种类型的图论题的套路还是比较简单且显然的. P2002 消息扩散 很显然的题目,因为在一个环(其实就是强连通分量)中的城市都只需要让其中一个 ...
- 洛谷—— P2002 消息扩散
P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市 ...
- P2002 消息扩散(缩点)
描述:https://www.luogu.com.cn/problem/P2002 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能 ...
- 洛谷P2002 消息扩散
题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n ...
- 洛谷 P2002 消息扩散
题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n ...
- P2002 消息扩散[SCC缩点]
题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入格式 第一行两个整数n,m表示n个城市, ...
- tarjan算法比较详细的讲解&&tarjan常见疑难解答&&洛谷P2002 消息扩散题解
因为有大佬写的比我更长更具体,所以我也就写写总结一下了 引入: 众所周知,很多图中有个东西名叫环. 对于这个东西很多算法都很头疼.(suchas 迪杰斯特拉) 更深层:环属于强联通分量(strongl ...
- 【luogu P2002 消息扩散】 题解
题目链接:https://www.luogu.org/problemnew/show/P2002 缩点把原图变为DAG,再在DAG上判断找入度为0的点的个数. 注意一点出度为0的点的个数不等于入度为0 ...
- LuoGu P2002 消息扩散
题目传送门 这个题其实就是tarjan缩点的板子题对吧....至少我是这么想的 首先这是个有向图,对于一个有向图,我们肯定要考虑环的存在与否,恰好这个题又是让我们找出最少的点,使得这几个点能够走遍全图 ...
随机推荐
- How to do if the GM MDI cant connect with the software
When you use GM MDI on your laptop , you may meet some troubles . Such as it cant communicate with t ...
- Java中在java.sql.Date的系统时间上加上30天并写入oracle
在java.sql.Date的系统时间上加上30天,并写入oracle 思路:通过 Calendar.getInstance() 获得对象,然后 add() 方法添加 时间,再通过 new java. ...
- 从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择
背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...
- Oracle之数据库的增删改查和格式的修改
Oracle修改数据 *update语句 格式: update table_name set column1=value1,…[where conditions] 例子: update userinf ...
- django 处理静态文件
settings: STATIC_URL = 'static/'STATIC_ROOT = os.path.join(BASE_DIR, 'static') urls: from django.con ...
- 10大H5前端框架 ......>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
作为一名做为在前端死缠烂打6年并且懒到不行的攻城士,这几年我还是阅过很多同门从知名到很知名的各种前端框架,本来想拿15-20个框架来分享一下,但在跟几个前辈讨教写文章的技巧时果断被无情的打击了,所以这 ...
- Google翻译实现
https://blog.csdn.net/yingshukun/article/details/53470424 Google翻译实现
- SQL介绍
SQL,即structured query language,结构化查询语言,是一种对关系型数据库中的数据进行管理和操作的语言方法,SQL包括6个部分 DQL:数据查询语言,最常用的为select,其 ...
- P4577 [FJOI2018]领导集团问题
P4577 [FJOI2018]领导集团问题 我们对整棵树进行dfs遍历,并用一个multiset维护对于每个点,它的子树可取的最大点集. 我们遍历到点$u$时: 不选点$u$,显然答案就为它的所有子 ...
- AngularJs 开发遇到的问题,以及解决方案
1>ng-if 导致 ng-model 失效的问题 比如说下拉联动隐藏显示的时候,多个验证模块,需要使用到ng-if.可以使用 $parent 来解决这个问题 ng-model="$p ...