原题链接:消息扩散 - 洛谷

 写在前面:缩点是对于有向图的

思路:想一下就能发现,其实就是要找到有多少个入度为0的点,以它们为消息源得到的结果是最小的。但是有两个问题:有环、重边。有环->缩点,把强联通的几个点(一个环)缩成一个点,然后这个时候其实可以不用重新建图,遍历每一条边,记录每个点的入度,如果这条边的左右两个点属于一个环中,那么就不记录入度;如果不属于一个环中,就记录入度。

AC代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define PII pair<int,int>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n) for(int i = n; i >= 1; ++i)using namespace std;
const double pi = acos(-1.0);const int N = 1e5 + 10;
const int M = 5e5 + 10;
int n,m,cnt,p,head[N],low[N],dfn[N],timeclock;
int st[N],top,instack[N],belong[N], ru[N];
struct ss{int next,to;
};ss data[M]; //用struct写的领接表,和head[]一起用
void add(int a,int b)
{data[++p].to=b;data[p].next=head[a];head[a]=p;
}
void dfs(int a)
{low[a]=dfn[a]=++timeclock;//初始化instack[a]=1;st[++top]=a;//入栈for(int i=head[a];i;i=data[i].next){if(!dfn[data[i].to]){dfs(data[i].to);low[a]=min(low[a],low[data[i].to]);//用子节点更新自己的LOW}elseif(instack[data[i].to])low[a]=min(low[a],dfn[data[i].to]);//若是在栈中 ,比较父子关系,并更新。}if(dfn[a]==low[a]){cnt++;while(st[top+1]!=a){belong[st[top]]=cnt;instack[st[top--]]=0;}}
}int main()
{scanf("%d%d",&n,&m);int a,b;for(int i=1;i<=m;i++){scanf("%d%d",&a,&b);add(a,b);}for(int i=1;i<=n;i++){if(!dfn[i])//用dfn[]来判断,如果dfn[i]为0,说明这个点还没判过{dfs(i);}}rep(i, n) //遍历每一条边求缩点后图每个点的入度{for(int j = head[i]; j ; j = data[j].next){if(belong[i] != belong[data[j].to]) ru[belong[data[j].to]]++;}}int res = 0;rep(i, cnt) if(!ru[i]) res++; //缩点之后其实只有cnt个点了(标号1~cnt),所以这里遍历不是从1到nprintf("%d", res);return 0;
}

P2002 消息扩散(图论 Tarjan缩点)相关推荐

  1. LuoGu P2002 消息扩散

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

  2. 【图论】Tarjan 缩点

    [Tarjan]缩点 在一个点N数据极大的图中,直接SPFA或者记忆花搜索时间超限,那么我们可以利用Tarjan缩点来减少N. 举个例子: 如上图:3,6两点为该图中的强连通分量,我们可以将它们看做一 ...

  3. 洛谷2002 消息扩散

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

  4. 【计蒜客 - 程序设计竞赛】商业信息共享(Tarjan缩点)

    题干: 商业信息共享 有 N 个公司,从每个公司都能单向地向另外一个公司分享最新商业信息,因为他们之间有着某种合作,你需要解决两个问题: 现在有一个最新的商业信息,至少需要告诉多少个公司,使得所有的公 ...

  5. BZOJ 1051 受欢迎的牛(Tarjan缩点)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4573  Solved: 2428 [Submit][S ...

  6. bzoj1051 [HAOI2006]受欢迎的牛 tarjan缩点

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢"是可以传递的--如果A喜 欢B,B喜 ...

  7. 洛谷P4742(tarjan缩点+拓扑DP)

    https://www.luogu.org/problemnew/show/P4742 题目背景 [Night - 20:02[Night−20:02 P.M.]P.M.] 夜空真美啊--但是--快要 ...

  8. 【POJ - 2186】Popular Cows (Tarjan缩点)

    题干: Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= ...

  9. 【BZOJ1179】atm,tarjan缩点+最长路径

    Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题目中是一个带点权的有向图,如果这是一个没有环的图那么问题就很简单,拓扑或者直接求最长(短)路径什么的 ...

最新文章

  1. 51单片机 小车 L298N pwm调速 串口控制 按键控制
  2. GIS影像数据集初步学习
  3. CBOX直播故障:正在连接
  4. Fragment 与DialogFragment 相互之间传递数据
  5. 构建测试的体系化思维(高级篇)
  6. 原生 Ajax 封装 和 Axios 二次 封装
  7. nginx 隐藏目录_Nginx学习之简单练习反向代理和负载均衡
  8. Don't Make Me Think
  9. window.URL对象的使用方式
  10. springboot旅游景区景点购票系统毕业设计毕设作品开题报告开题答辩PPT
  11. 如何查看linux是grub还lilo,在Linux中常用的启动引导工具:grub和lilo
  12. 【无标题】 天气决策树
  13. BZOJ 3270: 博物馆 1778: 驱逐猪猡 【概率DP+高斯消元】
  14. 计算机桌面图标不可以移动怎么调,win10电脑桌面图标不能移动怎么办,win10桌面图标移动不了的解决方法...
  15. Debian11.5 最小化安装后更改主机名、安装桌面、设置默认语言、时区、静态IP、局域网DNS等
  16. java saf_在不支持的浏览器中替代IndexedDB? Safari / iOS Saf-Chrome
  17. python 福利_发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片!...
  18. 安装/重装Win10系统
  19. yolact训练自定义数据集并转onnx
  20. Java 中 Pair 类的五种替代方案

热门文章

  1. linux下删除一个环境变量,Linux 添加环境变量和删除环境变量
  2. VM-CentOS7.6-启动时assuming drive cache:write through
  3. CCF小白刷题之路---201809-1 卖菜(C/C++ 100分)
  4. html+svg原理,SVG无功补偿的原理是什么
  5. 深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)
  6. 【OWASP TOP10】2021全球十大常见安全漏洞
  7. 源码安装禅道11.0总结
  8. 蓝桥杯真题 - 费解的开关题解
  9. CUDA进阶资料专题(一)pinned memory 和 unified memory
  10. Android--设置显示大小导致APP crash