[模板]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(相 ...
随机推荐
- 数据库数据——>文件xml
xml文件格式 <smss> <sms> <data> </data> </sms> </smss> 这里面的意思是将数据库里面 ...
- try...except语句
try: 执行语句 except 执行语句有异常就执行这一步 else: 执行语句没有异常就执行这一步 finally 不管有没有异常,这一步就要执行
- Jmeter-配置元件
CSV Data Set Config(CSV数据集配置) 参考:http://www.cnblogs.com/yanzhe/p/7728139.html DNS Cache Manager(DNS缓 ...
- ODBC, OLEDB, ADO, ADO.Net的演化简史
ODBC, OLEDB, ADO, ADO.Net的演化简史 Copy&Paste了一下午,终于一蹴而就此文,嘿嘿... 1.演变历史 它们是按照这个时间先后的顺序逐步出现的,史前->O ...
- Accessing data in Hadoop using dplyr and SQL
If your primary objective is to query your data in Hadoop to browse, manipulate, and extract it into ...
- vim之YCM配置
BundleInstall,默认会出现错误 ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you ne ...
- C# 通过二进制,将多个文件合并为一个。
C# 通过二进制,将多个文件合并为一个. /// <summary> /// 合并文件 /// </summary> /// <param name="strD ...
- hadoop-2.7.1:Error: Cannot find configuration directory: /etc/hadoop
本文转载自:http://blog.csdn.net/huangshanchun/article/details/49533433 安装hadoop参考:http://blog.csdn.net/hi ...
- solr跨core查询
参考文档:这里的跨core不使用solrcloud http://wiki.apache.org/solr/CoreAdmin 注意:跨core查询功能相比单core查询,是有限制的 只需要在ur ...
- Spring batch学习 持久化表结构详解(2)
#接上一篇 这一篇讲一下持久化需要表 batch_job_execution, batch_job_execution_context, batch_job_execution_params, bat ...