[模板]tarjan缩点+拓扑排序
题目:给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
题目简述:先tarjan缩点,再从入度为零处进行一次拓扑排序,求最长路即可,话说拓扑排序求最长路真方便。。。
注意: 要明确拓扑的写法,用栈写最优。
再进行拓扑排序之前我们要进行将点权转化为边权的操作,具体操作看拓扑排序。
#include<bits/stdc++.h>
using namespace std;
#define man 100010
inline int sc()
{ int x=,f=;char ch=getchar();
while(!isdigit(ch)){ if(ch==)f=-;ch=getchar();}
while(isdigit(ch)) { x=x*+ch-;ch=getchar();}
return x*f;
}
/*TEST*/
int n,m,c[man],x[man],y[man];
/*EDGE*/
int head[man<<],num=;
struct edge
{ int next,to,dis;}e[man<<];
inline void add(int from,int to,int dis)
{ e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
}
/*TARJAN*/
int dfn[man],low[man],bel[man],val[man],cnt=,dep=;
bool vis[man];
int sta[man],top=;
void tarjan(int s)
{ low[s]=dfn[s]=++dep;vis[s]=;sta[++top]=s;
for(int i=head[s];i;i=e[i].next)
{ int to=e[i].to;
if(!dfn[to])
{ tarjan(to);
low[s]=min(low[s],low[to]);
}
else if(vis[to])
{ low[s]=min(low[s],dfn[to]);}
}
if(low[s]==dfn[s])
{ int j;cnt++;
do
{ j=sta[top--];
vis[j]=;
val[cnt]+=c[j];
bel[j]=cnt;
}while(j!=s);
}
}
/*TOPSORT*/
inline void clear()
{ memset(e,,sizeof(e));
memset(head,,sizeof(head));
num=;
}
int degree[man],dis[man];
inline void topsort()
{ queue<int >q;
for(int i=;i<=cnt;i++)
dis[i]=;
for(int i=;i<=cnt;i++)
if(degree[i]==) q.push(i),dis[i]=val[i];
while(q.size()!=)
{ int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next)
{ int to=e[i].to;
degree[to]--;
if(degree[to]==) q.push(to);
dis[to]=max(dis[to],dis[u]+e[i].dis);
}
}
int ans=;
for(int i=;i<=cnt;i++)
ans=max(ans,dis[i]);
printf("%d\n",ans);
}
int main()
{ n=sc();m=sc();
for(int i=;i<=n;i++)
c[i]=sc();
for(int i=;i<=m;i++)
{ x[i]=sc(),y[i]=sc();
add(x[i],y[i],);
}
for(int i=;i<=n;i++)
if(!dfn[i]) tarjan(i);
clear();
for(int i=;i<=m;i++)
{ if(bel[ x[i] ]==bel[ y[i] ]) continue;
add(bel[x[i]],bel[y[i]],val[bel[y[i]]]);
degree[bel[y[i]]]++;
}
topsort();
return ;
}
[模板]tarjan缩点+拓扑排序的更多相关文章
- [HAOI2006]受欢迎的牛 tarjan缩点 + 拓扑排序
---题面--- 题解: 首先tarjan缩点应该还是容易想到的,因为喜爱具有传递性,所以一个强联通分量里面的点实际上是全部等效的,所以我们可以缩成一个方便判断, 缩完点之后整张图就变成了一个有向无环 ...
- 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...
- [luogu2272 ZJOI2007] 最大半连通子图 (tarjan缩点 拓扑排序 dp)
传送门 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向 ...
- 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...
- [ZJOI2007]最大半连通子图 (Tarjan缩点,拓扑排序,DP)
题目链接 Solution 大概是个裸题. 可以考虑到,如果原图是一个有向无环图,那么其最大半联通子图就是最长的一条路. 于是直接 \(Tarjan\) 缩完点之后跑拓扑序 DP就好了. 同时由于是拓 ...
- codeforces1213F tarjan缩点+拓扑排序
题意 给定两个长度为n的排列p和q,构造一个字符串s满足\(s[p_i]<=s[p_{i+1}]\)和\(s[q_i]<=s[q_{i+1}]\),且满足字符串中不同字符的个数不少于k. ...
- bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...
- HDU 6165 FFF at Valentine(Tarjan缩点+拓扑排序)
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- UVA 11324.The Largest Clique tarjan缩点+拓扑dp
题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...
随机推荐
- IOS中UITableViewCell使用详解
IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...
- 20155323 2016-2017-2 《Java程序设计》第8周学习总结
20155323 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 日志API:使用日志的起点是Logger类,要取得Logger类,必须使用Logger的静态 ...
- Spring Could与Dubbo、Docker、K8S
如果你是在一个中小型项目中应用Spring Cloud,那么你不需要太多的改造和适配,就可以实现微服务的基本功能.但是如果是在大型项目中实践微服务,可能会发现需要处理的问题还是比较多,尤其是项目中老代 ...
- python自动解析301、302重定向链接
使用模块requests 方式代码如下: import requests url_string="http://******" r = requests.head(url_stri ...
- sublime text 3 配置优化
1.在用Sublime里编写代码时,需要把TAB键转换成四个空格. 菜单栏里点击:首选项-> 设置-用户(Preferences-> Setting-User)在弹出来的文本里,添加如下两 ...
- erp中三大订单CO、PO、MO
ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...
- 'scalar deleting destructor' 和 'vector deleting destructor'的区别
在用到delete的时候,我们往往会针对类对象与类对象数组做不同删除,在这背后编译器是如何做的? #include<iostream> using namespace std; class ...
- Shell编程时常用的系统文件(转)
10.1 Linux系统目录结构 / 根目录,所有文件的第一级目录 /home 普通用户家目录 /root 超级用户家目录 /usr 用户命令.应用程序等目录 /var 应用数据.日志等目录 /lib ...
- vim之YCM配置
BundleInstall,默认会出现错误 ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you ne ...
- H5页面获取openid,完成支付公众号(未关注公众号)支付
一.页面授权 // 进入页面获取权限code function initAuthorizeCode() { var appid = $("#appid").val();//公众号a ...