【模拟8.09】轰炸行动(bomb) (tarjan缩点和拓扑排序)
很显然的tarjan嘛......拓扑也很容易想到
我是不会说我因为懒把拓扑改成DFS结果扔了40分然后就是纯板子了
因为我们一条路径的点如果不是一个一个炸,同时炸两个,他们一定会相互到达....
找最长链即可。
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 #include<string>
6 #include<algorithm>
7 #include<vector>
8 #include<map>
9 #include<stack>
10 #include<queue>
11 #define MAXN 2001001
12 #define ps push_back
13 #define int long long
14 using namespace std;
15 struct node{int to,n;}e1[MAXN*2],e2[MAXN*2];
16 int read()
17 {
18 int x=0;char c=getchar();
19 while(c<'0'||c>'9')c=getchar();
20 while(c>='0'&&c<='9')
21 {
22 x=(x<<1)+(x<<3)+(c^48);
23 c=getchar();
24 }
25 return x;
26 }
27 int head1[MAXN],tot1,head2[MAXN],tot2;int sum[MAXN];
28 vector<int>v[MAXN];
29 int vis[MAXN],dfn[MAXN],low[MAXN],cnt=0;
30 void add1(int u,int v)
31 {
32 e1[++tot1].to=v;e1[tot1].n=head1[u];head1[u]=tot1;
33 }
34 void add2(int u,int v)
35 {
36 e2[++tot2].to=v;e2[tot2].n=head2[u];head2[u]=tot2;
37 }
38 int n,m;
39 int de;stack<int>q;int belong[MAXN];int ru[MAXN];
40 void tarjan(int x)
41 {
42 dfn[x]=low[x]=++de;vis[x]=1;q.push(x);
43 for(int i=head1[x];i;i=e1[i].n)
44 {
45 int to=e1[i].to;
46 if(!dfn[to])
47 {
48 tarjan(to);
49 low[x]=min(low[x],low[to]);
50 }
51 else if(vis[to])
52 {
53 low[x]=min(low[x],low[to]);
54 }
55 }
56 if(low[x]==dfn[x])
57 {
58 cnt++;
59 int top=0;
60 do
61 {
62 top=q.top();q.pop();
63 belong[top]=cnt;
64 vis[top]=0;v[cnt].ps(top);
65 //printf("cnt=%lld top=%lld\n",cnt,top);
66 }
67 while(top!=x);
68 sum[cnt]=v[cnt].size();
69 }
70 }
71 void init()
72 {
73 for(int x=1;x<=n;++x)
74 {
75 for(int i=head1[x];i;i=e1[i].n)
76 {
77 int to=e1[i].to;
78 if(belong[x]==belong[to])continue;
79 add2(belong[x],belong[to]);//单项边
80 ru[belong[to]]++;
81 //printf("belong[%lld]=%lld belong[%lld]=%lld\n",x,belong[x],to,belong[to]);
82 }
83 }
84 }
85 int deep[MAXN];int maxn=0;
86 queue<int>qq;
87 void tuopu()
88 {
89 while(!qq.empty())
90 {
91 int top=qq.front();
92 qq.pop();
93 maxn=max(deep[top],maxn);
94 for(int i=head2[top];i;i=e2[i].n)
95 {
96 int to=e2[i].to;
97 deep[to]=max(deep[to],deep[top]+sum[to]);
98 maxn=max(deep[to],maxn);
99 ru[to]--;
100 if(ru[to]==0)qq.push(to);
101 }
102 }
103 }
104 signed main()
105 {
106 n=read();m=read();
107 for(int i=1;i<=m;++i)
108 {
109 int x,y;
110 x=read();y=read();
111 add1(x,y);
112 }
113 for(int i=1;i<=n;++i)
114 {
115 if(!dfn[i])
116 {
117 tarjan(i);
118 }
119 }
120 init();
121 for(int i=1;i<=cnt;++i)
122 {
123 if(ru[i]==0)
124 {
125 deep[i]=max(deep[i],sum[i]);
126 qq.push(i);
127 }
128 }
129 tuopu();
130 printf("%lld\n",maxn);
131 }
【模拟8.09】轰炸行动(bomb) (tarjan缩点和拓扑排序)的更多相关文章
- 【模拟7.16】通讯(tarjan缩点加拓扑排序)
这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树 因为是单向边,不然就可能不是一个联通图了.... 1 #include< ...
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
- BZOJ1565 [NOI2009]植物大战僵尸 【最大权闭合子图 + tarjan缩点(或拓扑)】
题目 输入格式 输出格式 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. 输入样例 3 2 10 0 20 0 -10 0 -5 1 0 0 100 ...
- luogu P3387 【模板】缩点_拓扑排序
还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...
- 【noip模拟赛4】找啊找啊找BF 拓扑排序
描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...
- 【CSP模拟赛】益智游戏(最短路(DJSPFA)&拓扑排序)
题目描述 小P和小R在玩一款益智游戏.游戏在一个正权有向图上进行. 小P 控制的角色要从A 点走最短路到B 点,小R 控制的角色要从C 点走最短路到D 点. 一个玩家每回合可以有两种选择,移动到一个相 ...
- hdu6165(拓扑排序+tarjan缩点)
题意:就任意两个点能否到达: 解题思路:首先将图简化,比如假设图里有一个环,那么,这环内两个点肯定是能相互到达的,那么就不用考虑这环内的点了,很简单就想到用tarjan算法将环缩成一个点,然后就是判断 ...
- [luogu2272 ZJOI2007] 最大半连通子图 (tarjan缩点 拓扑排序 dp)
传送门 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向 ...
- 炸弹:线段树优化建边+tarjan缩点+建反边+跑拓扑
这道题我做了有半个月了...终于A了... 有图为证 一句话题解:二分LR线段树优化建边+tarjan缩点+建反边+跑拓扑统计答案 首先我们根据题意,判断出来要炸弹可以连着炸,就是这个炸弹能炸到的可以 ...
随机推荐
- 轻量级工具Vite到底牛在哪——一文全知道
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vitejs-front-end-build- ...
- SE_Work4_软件案例分析
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求:分析软件案例 个人博客作业-软件案例分析 班级 005 这个作业在哪个具体方面帮助我实现目标 分析对比一类软件,学会规划分析软件的 ...
- 『动善时』JMeter基础 — 16、JMeter配置元件【HTTP信息头管理器】
目录 1.用于演示的项目说明 2.测试计划内包含的元件 3.HTTP请求界面内容 4.查看脚本执行结果 5.添加请求头信息(HTTP信息头管理器) 6.优先级说明 7.补充:常见请求头信息 JMete ...
- 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案
阅文时长 | 0.72分钟 字数统计 | 1164.8字符 主要内容 | 1.问题起因及解决方案 2.安装jdk-8u241-windows-x64 3.取消PolyBase查询服务 4.四.声明与参 ...
- [bug] Mysql 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
参考 https://blog.csdn.net/cherrycheng_/article/details/51251441?
- sed 's/AA/BB/' file # 将文件中的AA替换成BB,只替换一行中第一次出现的AA,替换后的结果输出到屏幕 sed 's/AA/BB/g' file # 将文件中的所有AA都替换成BB,替换后的结果输出到屏幕
生信人的自我修养:Linux命令速查手册 简佐义 四川大学 生物信息学硕士 科学求真 赢 10 万奖金 · 院士面对面 209 人赞同了该文章 许多人做生物信息学,要么不重视Linux,要么不知道 ...
- Gaussian Mixture Model
Gaussian Mixture Model (GMM).事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clustering 上之外,还经 ...
- 如何用WINPE备份电脑系统;电脑备份 听语音
如何用WINPE备份电脑系统:电脑备份 听语音 原创 | 浏览:1046 | 更新:2017-09-30 15:09 1 2 3 4 5 6 7 分步阅读 备份系统已经成为一种常态,我们在安装完成系统 ...
- Linux创建RAID5_实战
Linux创建RAID5实战 Linux创建RAID5 RAID5最少由三个硬盘组成,它将数据分散存储于阵列中的每个硬盘,并且还伴有一个数据校验位,数据位与校验位通过算法能相互验证 RAID5最多能允 ...
- C++知识点案例 笔记-1
1.重载函数 2.内联函数 3.New.Delete 4.重载与.const形参 5.常数据成员 6.静态成员函数 ==重载函数== #include <iostream> using n ...