luogu P3387 【模板】缩点_拓扑排序
还是很好些的.
Code:
- #include <stack>
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- #include <cstring>
- #include <map>
- #define setIO(s) freopen(s".in","r",stdin)
- using namespace std;
- namespace Tarjan{
- #define maxn 1000000
- #define ll long long
- map<int,int>ed[maxn];
- int scc,sig;
- int vis[maxn];
- int du[maxn];
- int idx[maxn];
- int pre[maxn],low[maxn];
- int val[maxn];
- long long value[maxn];
- long long ans[maxn];
- stack<int>S;
- queue<int>Q;
- struct graph{
- int cnt;
- int head[maxn],to[maxn<<1],nex[maxn<<1];
- void addedge(int u,int v){
- nex[++cnt] = head[u],head[u]=cnt,to[cnt] = v;
- }
- }G1,G2;
- void tarjan(int u){
- S.push(u);
- vis[u] = 1;
- pre[u] = low[u] = ++scc;
- for(int v=G1.head[u];v;v=G1.nex[v]){
- if(!vis[G1.to[v]]) {
- tarjan(G1.to[v]);
- low[u] = min(low[u],low[G1.to[v]]);
- }
- else if(vis[G1.to[v]] == 1) low[u] = min(low[u],pre[G1.to[v]]);
- }
- if(pre[u] == low[u]) {
- ++sig;
- for(;;){
- int a=S.top(); S.pop();
- vis[a] = -1,idx[a] = sig;
- value[sig] += (ll)val[a];
- if(a==u) break;
- }
- }
- }
- void toposort(){
- for(int i=1;i<=sig;++i)
- for(int j=G2.head[i];j;j=G2.nex[j]) ++du[G2.to[j]];
- for(int i=1;i<=sig;++i) if(du[i]==0) Q.push(i),ans[i] = value[i];
- while(!Q.empty()){
- int u=Q.front(); Q.pop();
- for(int v=G2.head[u];v;v=G2.nex[v]){
- ans[G2.to[v]] = max(ans[G2.to[v]],ans[u] + value[G2.to[v]]);
- --du[G2.to[v]];
- if(du[G2.to[v]]==0) Q.push(G2.to[v]);
- }
- }
- long long fin=0;
- for(int i=1;i<=sig;++i)
- fin=max(fin,ans[i]);
- printf("%lld",fin);
- }
- int main(){
- int n,m,a,b;
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;++i) scanf("%d",&val[i]);
- for(int i=1;i<=m;++i) {
- scanf("%d%d",&a,&b);
- G1.addedge(a,b);
- }
- for(int i=1;i<=n;++i) if(!vis[i]) tarjan(i);
- for(int i=1;i<=n;++i)
- for(int v=G1.head[i];v;v=G1.nex[v])
- if(idx[i]!=idx[G1.to[v]] && !ed[idx[i]][idx[G1.to[v]]])
- G2.addedge(idx[i],idx[G1.to[v]]),ed[idx[i]][idx[G1.to[v]]]=1;
- toposort();
- return 0;
- }
- };
- int main(){
- Tarjan::main();
- return 0;
- }
luogu P3387 【模板】缩点_拓扑排序的更多相关文章
- b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图
b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
- [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)
[LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...
- 【模拟7.16】通讯(tarjan缩点加拓扑排序)
这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树 因为是单向边,不然就可能不是一个联通图了.... 1 #include< ...
- 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...
随机推荐
- day25-2 random,os,sys模块
目录 random 为什么要有random模块,random模块有什么用 os 为什么要有os模块,os模块有什么用 sys 为什么要有sys模块,sys模块有什么用 random import ra ...
- nginx日志按日期自动切割脚本
#!/bin/bash #nginx日志切割脚本 #author:setevn #设置日志文件存放目录 logs_path="/usr/local/nginx/logs/" #设置 ...
- js中时间戳与日期时间之间的相互转换
1.时间戳转换为标准日期时间格式: function timeFormat(dateStr) { var date = new Date(dateStr); Y = date.getFullYear( ...
- 洛谷P3960 列队 Splay
其实思路并不算太难,就是代码量相对较大. 我们将一次离队转换为一次删除和两次加入,这样就可以保证空间是动态分配的,最大也不会暴空间. 说实话写之前感觉会很恶心,但是代码量就还好吧,有些细节需要特殊注意 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- ASP.NET学习笔记01
ASP.NET初级工程师的核心要求:能够实现一个基本的网站. ASP.NET初级工程师面试主要要求: 1.基础的数据结构和算法 2.C#编程语言基础 3.网站基础(HTML,CSS,Javascrip ...
- [CortexM0--stm32f0308]Low Power Mode
问题描写叙述 stm32f0308正常是运行在Run mode下.这样的mode是在reset之后的默认模式.Low Power Mode.即低功耗模式.用于在IC空暇时能够考虑选择进入.使系统耗能减 ...
- SDUT 1225-编辑距离(串型dp)
编辑距离 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 如果字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符改动 ...
- 怎样在同一台电脑使用不同的账号提交到同一个github仓库
近期这段时间使用github.有时在公司办公,想要用git提交代码到自己的github仓库,提交是显示的作者是自己在公司的账户.而不是自己的github账户.这就相当于提交到github的代码不是自己 ...
- bzoj3998: [TJOI2015]弦论(SAM+dfs)
3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...