洛谷 P2002 消息扩散

题目背景

本场比赛第一题,给个简单的吧,这 100 分先拿着。

题目描述

有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息。

输入输出格式

输入格式:

第一行两个整数n,m表示n个城市,m条单向道路。

以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环。

输出格式:

一行一个整数,表示至少要在几个城市中发布消息。

输入输出样例

输入样例#1:

5 4
1 2
2 1
2 3
5 1

输出样例#1:

2

说明

【数据范围】

对于20%的数据,n≤200;

对于40%的数据,n≤2,000;

对于100%的数据,n≤100,000,m≤500,000.

【限制】

时间限制:1s,内存限制:256M

【注释】

样例中在4,5号城市中发布消息。

求入度为0的强连通分量

吐槽:说好的自环呢。。

屠龙宝刀点击就送

#include <cstdio>
#include <map>
#define N 500005

using namespace std;
map<pair<int,int>,bool>q;
int nextt[N],to[N],head[N],cnt,n,m,col[N],sumcol,low[N],dfn[N],tim,stack[N],top,rd[N];
bool instack[N];
inline void ins(int u,int v)
{
    nextt[++cnt]=head[u];
    to[cnt]=v;
    head[u]=cnt;
}
template<typename T>
inline T Min(T a,T b) {return a>b?b:a;}
void tarjan(int x)
{
    low[x]=dfn[x]=++tim;
    stack[++top]=x;
    instack[x]=true;
    for(int i=head[x];i;i=nextt[i])
    {
        int v=to[i];
        if(!dfn[v])
        {
            tarjan(v);
            low[x]=Min(low[x],low[v]);
        }
        else if(instack[v]) low[x]=Min(low[x],dfn[v]);
    }
    if(low[x]==dfn[x])
    {
        int k;
        sumcol++;
        do
        {
            k=stack[top--];
            col[k]=sumcol;
            instack[k]=false;
        }while(k!=x);
    }
}
int Main()
{
    scanf("%d%d",&n,&m);
    for(int a,b;m--;)
    {
        scanf("%d%d",&a,&b);
        if(a==b) continue;
        ins(a,b);
    }
    int sum=0;
    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=nextt[j])
      if(col[i]!=col[to[j]])
       rd[col[to[j]]]++;
    for(int i=1;i<=sumcol;++i) if(!rd[i]) sum++;
    printf("%d\n",sum);
    return 0;
}
int sb=Main();
int main(int argc,char *argv[]){;}
时间: 2024-08-08 11:01:49

洛谷 P2002 消息扩散的相关文章

洛谷P2002 消息扩散

题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入输出格式 输入格式: 第一行两个整数n,m表示n个城市,m条单向道路. 以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环. 输出格式: 一行一个整数,表示至少要在几个城市中发布消息. 输入输出样例 输入样例#1: 5 4 1 2 2 1 2 3 5

洛谷—— P2002 消息扩散

https://www.luogu.org/problem/show?pid=2002 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入输出格式 输入格式: 第一行两个整数n,m表示n个城市,m条单向道路. 以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环. 输出格式: 一行一个整数,表示至少要

[洛谷2002]消息扩散

思路:Tarjan缩点后统计入度为$0$的连通分量. 1 #include<stack> 2 #include<cstdio> 3 #include<cctype> 4 #include<vector> 5 inline int getint() { 6 char ch; 7 while(!isdigit(ch=getchar())); 8 int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<

P2002 消息扩散

P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入输出格式 输入格式: 第一行两个整数n,m表示n个城市,m条单向道路. 以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环. 输出格式: 一行一个整数,表示至少要在几个城市中发布消息. 输入输出样例 输入样例#1: 5 4 1

题解 P2002 消息扩散

题解 P2002 消息扩散 题目链接 非常裸的一道缩点题,很显然每个强连通分量里给一个点消息就够了,缩完点以后很显然我们要讨论每一个点的入度.对于入度为零的点(没有其它点能给他消息),我们就必须给它一份消息,所以就变成了数入度为零的点.由于数据规模,所以我们不需要重新建图. 值得一提的是一个小细节.重边和自环.我一开始用map判重边结果t了一个点(也有可能是这个点有自环qaq),然后删了map特判判自环就直接过了,看来重边好像对这道题没什么影响??(大雾 代码:几乎是裸的模版题,好像比模版题还简

luogu P2002 消息扩散

题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入输出格式 输入格式: 第一行两个整数n,m表示n个城市,m条单向道路. 以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环. 输出格式: 一行一个整数,表示至少要在几个城市中发布消息. 输入输出样例 输入样例#1: 5 4 1 2 2 1 2 3 5

P2002 消息扩散[SCC缩点]

题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息. 输入格式 第一行两个整数n,m表示n个城市,m条单向道路. 以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环. 输出格式 一行一个整数,表示至少要在几个城市中发布消息. 输入输出样例 输入 #1复制 输出 #1复制 说明/提示 [数据范围] 对于20%的数据,n≤200; 对于40%的数据,n≤2,000; 对于1

洛谷P1084 疫情控制

题目:https://www.luogu.org/problemnew/show/P1084 这道题由于洛谷数据有点水,如果有vijos的推荐去vijos交一下,他的数据还好. vijos:https://vijos.org/p/1783 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3