[bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093

分析:

首先肯定是先把强联通全部缩成一个点,然后成了一个DAG

下面要知道一点:原图的最大半联通子图实际是上是新DAG图的一个最长链

然后就像拓扑排序一样(不过这是以出度为0的点优先,拓扑排序以入度为0的点优先),设f[i]表示以节点i为起始节点的最长链的长度,s[i]表示以节点i为起始节点的最长链的条数,然后就DP一样搞……

注意:

1、缩点的时候有可能有重边,要注意判断

2、在DP的时候s[]求和的时候要一边加一边mod

时间: 2024-11-15 18:16:10

[bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)的相关文章

BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )

WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就是记忆化搜一下...重边就用set判一下 ------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring

bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)

1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 897[Submit][Status][Discuss] Description Input 第一行包含两个整数N,M,X.N,M分别表示图G的点数与边数,X的意义如上文所述.接下来M行,每行两个正整数a, b,表示一条有向边(a, b).图中的每个点将编号为1,2,3…N,保证输入中同一个(a,b)不会出现两次. Outpu

BZOJ 1093 [ZJOI2007]最大半连通子图

题意:一个有向图中,若对于任意两个点s和t,要么存在一条从s到t的路径,要么存在一条t到s的路径(当然两条路径都存在也是可以的),那么称这个有向图是一个半联通图.现在给定一个有向图,求出该有向图中点数最多的半联通子图的点数以及个数. 很显然,在一个最优方案中,同一个强连通分量中的点要么都选,要么都不选. 很自然地,先用tarjan缩个点,得到一个有向无环图,每个点的点权为对应的强连通分量的点的个数. 然后稍微脑补一下,就知道第一问的答案显然是该有向无环图上最长链的长度,而第二问的答案自然也就是最

BZOJ 1093 ZJOI2007 最大半连通子图 Tarjan+动态规划

题目大意:定义半连通子图为一个诱导子图,其中任意两点(x,y)中x可到达y或y可到达x,求最大半连通子图的大小以及方案数 不就是个缩点之后拓扑序DP求最长链么 这题意逗不逗233333 注意缩点后连边不要连重复了 判重边那里我用了set... #include <set> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M

BZOJ 1093 ZJOI 2007 最大半连通子图 强联通分量+拓扑图DP

题目大意:定义半连通图:图中任意两点之间可以单向到达.求一个图的最大半连通子图,和这个图最大半连通子图的个数. 思路:半连通图并不是一定要没有环..这题意让我理解的.. 其实想法什么的不难,想明白了也不难写.因为要保证半连通,所以要先处理出一个图的联通状况.先用Tarjan缩点得到DAG,在这个DAG上找到最长链的长度就是第一问的答案.第二问可以先找到所有f值等于答案的点,在这些点上反向记忆化搜索DP. 注意一个小地方,ans的初值是最大的scc的大小,如果是0的化会wa一个点. CODE: #

【BZOJ】1093: [ZJOI2007]最大半连通子图(tarjan+拓扑序)

http://www.lydsy.com/JudgeOnline/problem.php?id=1093 两个条件综合起来加上求最大的节点数,那么很明显如果是环一定要缩点. 然后再仔细思考下就是求dag的最长路的数目啦... 然后wa了... 看了题解...噗!第一次注意到缩点后会有重边QAQ...于是.. orz orz 然后思考了下怎么处理重边...很简单,每个点bfs时记录一下就行了.. #include <cstdio> #include <cstring> #includ

【BZOJ 1093】 [ZJOI2007]最大半连通子图

1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 1732  Solved: 679 [Submit][Status] Description Input 第一行包含两个整数N,M,X.N,M分别表示图G的点数与边数,X的意义如上文所述.接下来M行,每行两个正整数a, b,表示一条有向边(a, b).图中的每个点将编号为1,2,3-N,保证输入中同一个(a,b)不会出现两次. Output 应包含两行

BZOJ 1093 最大半连通子图(强连通分量+树形DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1093 题意: 思路:(1)首先,强连通分量中的一个点若在最大半连通子图中,则必定整个连通分量中的点都在,因为都在还是满足半连通的性质而且使得节点数更多. (2)因此,求出强连通分量缩点,形成一个有向无环图,其实与树是差不多的.在这个图上DP一次即可,也就是找出最长链以及最长链的个数. vector<int> g[N],g1[N]; int n,m,mod; int dfn[N],lo

[ZJOI2007]最大半连通子图

[ZJOI2007]最大半连通子图 题目大意: 一个有向图称为半连通的,当且仅当对于任意两点\(u,v\),都满足\(u\)能到达\(v\)或者\(v\)能到达\(u\). 给定一个\(n(n\le10^5)\)个点,\(m(m\le10^6)\)条边的有向图, 问该图最大半连通子图的节点个数及方案数. 思路: 缩点后在DAG上DP求带点权最长链,并统计方案数即可. 源代码: #include<stack> #include<queue> #include<cstdio>