洛谷—— P2002 消息扩散

https://www.luogu.org/problem/show?pid=2002

题目背景

本场比赛第一题,给个简单的吧,这 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的强连通个数、

 1 #include <cstdio>
 2
 3 #define min(a,b) (a<b?a:b)
 4 inline void read(int &x)
 5 {
 6     x=0; register char ch=getchar();
 7     for(; ch>‘9‘||ch<‘0‘; ) ch=getchar();
 8     for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘;
 9 }
10 const int N(100005);
11 const int M(500005);
12 int head[N],sumedge;
13 struct Edge {
14     int v,next;
15     Edge(int v=0,int next=0):v(v),next(next){}
16 }edge[M];
17 inline void ins(int u,int v)
18 {
19     edge[++sumedge]=Edge(v,head[u]); head[u]=sumedge;
20 }
21
22 int tim,dfn[N],low[N];
23 int top,Stack[N],instack[N];
24 int sumcol,col[N],ans,rd[N];
25 void Tarjan(int u)
26 {
27     low[u]=dfn[u]=++tim;
28     Stack[++top]=u;
29     instack[u]=true;
30     for(int v,i=head[u]; i; i=edge[i].next)
31     {
32         v=edge[i].v;
33         if(!dfn[v]) Tarjan(v),low[u]=min(low[u],low[v]);
34         else if(instack[v])      low[u]=min(low[u],dfn[v]);
35     }
36     if(low[u]==dfn[u])
37     {
38         col[u]=++sumcol;
39         for(; Stack[top]!=u; top--)
40         {
41             col[Stack[top]]=sumcol;
42             instack[Stack[top]]=false;
43         }
44         instack[u]=0; top--;
45     }
46 }
47
48 int Presist()
49 {
50     int n,m; read(n),read(m);
51     for(int u,v,i=1; i<=m; ++i)
52         read(u),read(v),ins(u,v);
53     for(int i=1; i<=n; ++i)
54         if(!dfn[i]) Tarjan(i);
55     for(int v,u=1; u<=n; ++u)
56         for(int i=head[u]; i; i=edge[i].next)
57         {
58             v=edge[i].v;
59             if(col[u]!=col[v]) rd[col[v]]++;
60         }
61     for(int i=1; i<=sumcol; ++i) if(!rd[i]) ans++;
62     printf("%d\n",ans);
63     return 0;
64 }
65
66 int Aptal=Presist();
67 int main(int argc,char*argv[]){;}
时间: 2024-08-29 09:52:12

洛谷—— 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 消息扩散

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

[洛谷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