洛谷P2002 消息扩散(tarjan)
来源:互联网 发布:视频转换音乐软件 编辑:程序博客网 时间:2024/05/16 09:58
消息扩散
题目描述
有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n个城市都得到消息。
输入输出格式
输入格式:
第一行两个整数n,m表示n个城市,m条单向道路。
以下m行,每行两个整数b,e表示有一条从b到e的道路,道路可以重复或存在自环。
输出格式:
一行一个整数,表示至少要在几个城市中发布消息。
分析:用tarjan缩点,入度为0的强连通分量的个数就是ans。
代码
#include <cstdio>#include <cstring>#include <stack>#define maxn 600000using namespace std;stack<int> s;struct edge{ int x,y,nxt;}g[maxn];int p=0,n,m,ans=0;bool instack[maxn];int dfn[maxn],low[maxn],ls[maxn],belong[maxn],d[maxn];void tarjan(int i){ p++; s.push(i); instack[i]=true; dfn[i]=low[i]=p; for (int k=ls[i];k;k=g[k].nxt) { int j=g[k].y; if (dfn[j]==0) { tarjan(j); if (low[j]<low[i]) low[i]=low[j]; } else { if (instack[j]&&dfn[j]<low[i]) low[i]=dfn[j]; } } if (dfn[i]==low[i]) { ans++; int j; do { j=s.top(); s.pop(); instack[j]=false; belong[j]=ans; } while (i!=j); }}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&g[i].x,&g[i].y); g[i].nxt=ls[g[i].x]; ls[g[i].x]=i; } for (int i=1;i<=n;i++) if (dfn[i]==0) tarjan(i); for (int i=1;i<=m;i++) if (belong[g[i].x]!=belong[g[i].y]) d[belong[g[i].y]]++; int o=0; for (int i=1;i<=ans;i++) if (d[i]==0) o++; printf("%d",o);}
阅读全文
0 0
- 洛谷P2002 消息扩散(tarjan)
- 【洛谷 P2002】消息扩散 tarjan
- 洛谷 P2002 消息扩散
- 消息扩散(Tarjan算法缩点处理)
- (哈希)Squares (p2002)
- 洛谷 2002_消息扩散_强连通分量
- 洛谷 P1661 扩散
- 洛谷1661 扩散
- 洛谷 P1661 扩散
- 洛谷 P1262|P2341|P2002 强连通分量,缩点
- Tyvj P2002 扑克牌
- 杭电acm P2002
- 各项异性扩散(Anisotropic diffusion)
- 机器学习人群扩散(LPA算法)
- 三言两语说shader(七)黑幕扩散
- 各项异性扩散(Anisotropic diffusion)
- 图像特效之毛玻璃(扩散)
- 【NOIP2015】洛谷P2661 信息传递(tarjan)
- 程序员技术与文艺的PK_来首届阿里巴巴研发效能嘉年华
- Kotlin学习一 Android Studio 中安装 Kotlin Plugin
- Laravel5中使用自定义公共函数,全局使用
- 学习网站
- stm32 bin文件和hex文件的生成和下载
- 洛谷P2002 消息扩散(tarjan)
- abap开发变量定义和基本运算
- Eclipse中中文注释字体太小的解决方案
- PAT甲级 1006. Sign In and Sign Out (25)
- MyEclipse创建简单的webService的服务端和客户端
- 如何纠正二岁小孩爱哭的毛病
- 对比线程安全和可重入函数
- Android四大组件之Service
- centOS7安装rz和sz