题目链接:https://www.luogu.org/problemnew/show/P2002

缩点把原图变为DAG,再在DAG上判断找入度为0的点的个数。

注意一点出度为0的点的个数不等于入度为0的点。

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 500000 + 10;
struct edge{
int next, to, from, len;
}e[maxn<<2];
int head[maxn], cnt;
int n, m, color[maxn], du[maxn], num, tim, ans, tmp;
int dfn[maxn], low[maxn];
bool vis[maxn];
stack<int> s;
void add(int u, int v)
{
e[++cnt].from = u;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
void tarjan(int x)
{
dfn[x] = low[x] = ++tim;
s.push(x); vis[x] = 1;
for(int i = head[x]; i != -1; i = e[i].next)
{
int v = e[i].to;
if(!dfn[v])
{
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis[v])
{
low[x] = min(low[x], low[v]);
}
}
if(dfn[x] == low[x])
{
color[x] = ++num;
vis[x] = 0;
while(s.top() != x)
{
color[s.top()] = num;
vis[s.top()] = 0;
s.pop();
}
s.pop();
}
}
int main()
{
//freopen("testdata.in","r",stdin);
//freopen("testdata.out","w",stdout);
memset(head, -1, sizeof(head));
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++)
{
int u, v;
scanf("%d%d",&u,&v);
if(u != v) add(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 != -1; j = e[j].next)
{
int v = e[j].to;
if(color[v] != color[i])
{
du[color[v]]++;
}
}
}
for(int i = 1; i <= num; i++)
{
if(!du[i])
{
tmp++;
}
}
printf("%d",tmp);
return 0;
}

【luogu P2002 消息扩散】 题解的更多相关文章

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

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

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

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

  3. LuoGu P2002 消息扩散

    题目传送门 这个题其实就是tarjan缩点的板子题对吧....至少我是这么想的 首先这是个有向图,对于一个有向图,我们肯定要考虑环的存在与否,恰好这个题又是让我们找出最少的点,使得这几个点能够走遍全图 ...

  4. 洛谷—— P2002 消息扩散

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

  5. P2002 消息扩散(缩点)

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

  6. 洛谷P2002 消息扩散

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

  7. 洛谷 P2002 消息扩散

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

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

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

  9. P2002 消息扩散

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

随机推荐

  1. 1、java线程模型

    要了解多线程,先需要把java线程模型搞清楚,否则有时候很难理清楚一个问题. 硬件多线程: 物理机硬件的并发问题跟jvm中的情况有不少相似之处,物理机的并发处理方案对于虚拟机也有相当大的参考意义.在买 ...

  2. 阻止事件的默认行为,例如click <a>后的跳转~

    在W3C中,使用preventDefault()方法: 在IE中,使用window.event.returnValue = false.

  3. JQuery选择器——《锋利的JQuery》

    刚学CSS的时候我们已经接触了选择器,其实就是按照一定的规则选择出来我们想要获取到的元素.在这里,既然选择了用jQuery选择器,首先来谈谈JQuery选择器的优势: 1.简洁的写法:$()函数在很多 ...

  4. jqGrid 将行变成超连接时浏览器解析超连接错误

    1.将行变成超连接如下所示 name: , align: "center", formatter: function (cellValue, options, rowdata, a ...

  5. C#博客记录二

    1.认识运算符 我认为其中 最重要的就是逻辑运算符,对于每个人来说学习web前端就是要有一个好的思维.能够更好的运用. 2.算数运算符 变量名++意味先输出,值后增加. ++变量名意味值先增加,后输出 ...

  6. 程序员心灵鸡汤桌面壁纸1080p 欢迎大家下载,HTML,PHP,node,css,前端

    上段时间在读书的时候看见了一句话:一张地图,不论比例多么精确,它永远不可能带着主人在地面上移动半步, 作为爱思考,爱学习的程序员 突然想到了:一份帮助文档,不论多么详细,它永远不会帮助主人敲一行代码. ...

  7. .net使用redis入门笔记

    1.学习blog:http://www.cnblogs.com/yangecnu/p/Introduct-Redis-in-DotNET.html 2.redis官网:http://redis.io/ ...

  8. SGI STL红黑树中迭代器的边界值分析

    前言 一段程序最容易出错的就是在判断或者是情况分类的边界地方,所以,应该对于许多判断或者是情况分类的边界要格外的注意.下面,就分析下STL中红黑树的迭代器的各种边界情况.(注意:分析中STL使用的版本 ...

  9. 关于c3p0连接池连接mysql数据库需要注意的几点

    什么是数据库连接池: 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象. 当使用完Co ...

  10. PAT 1076 Forwards on Weibo

    #include <cstdio> #include <cstdlib> #include <vector> #include <queue> #inc ...