bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序

最大半联通子图对应缩点后的$DAG$上的最长链
复杂度$O(n + m)$
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define ri register int
#define sid 1005000 int n, m, id, nid, cnp, mod, top;
int pre[sid], nxt[sid], node[sid], cap[sid], vis[sid];
int low[sid], dfn[sid], st[sid], ins[sid], cnt[sid], b[sid], deg[sid], q[sid]; inline void addedge(int u, int v) {
nxt[++ cnp] = cap[u]; cap[u] = cnp;
pre[cnp] = u; node[cnp] = v; deg[v] ++;
} void tarjan(int o, int fa) {
low[o] = dfn[o] = ++ id; st[++ top] = o; ins[o] = ;
#define cur node[i]
for(int i = cap[o]; i; i = nxt[i]) {
if(!dfn[cur]) tarjan(cur, o), low[o] = min(low[o], low[cur]);
else if(ins[cur]) low[o] = min(low[o], dfn[cur]);
}
if(dfn[o] == low[o]) {
int p; ++ nid;
do{ p = st[top --]; b[p] = nid;
ins[p] = ; cnt[nid] ++;
} while(p != o);
}
} inline void inc(int &a, int b)
{ a += b; if(a >= mod) a -= mod; } struct dp {
int sz, num;
friend void cmax(dp &a, dp b) {
if(b.sz > a.sz) a = b;
else if(b.sz == a.sz) inc(a.num, b.num);
}
} f[sid]; void top_dp() {
int fr = , to = ;
for(ri i = ; i <= nid; i ++) {
if(!deg[i]) q[++ to] = i;
f[i] = { cnt[i], };
}
#define cur node[i]
while(fr <= to) {
int o = q[fr ++];
for(ri i = cap[o]; i; i = nxt[i]) {
deg[cur] --; if(!deg[cur]) q[++ to] = cur;
if(vis[cur] == o) continue;
cmax(f[cur], (dp){ f[o].sz + cnt[cur], f[o].num } );
vis[cur] = o;
}
}
dp ans = { , };
for(ri i = ; i <= nid; i ++) cmax(ans, f[i]);
printf("%d\n%d\n", ans.sz, ans.num);
} int main() {
n = read(); m = read(); mod = read();
for(ri i = ; i <= m; i ++) {
int u = read(), v = read();
addedge(u, v);
}
for(ri i = ; i <= n; i ++)
if(!dfn[i]) tarjan(i, );
memset(cap, , (n + ) << );
memset(deg, , (n + ) << );
int cno = cnp; cnp = ;
for(ri i = ; i <= cno; i ++)
if(b[pre[i]] != b[node[i]]) addedge(b[pre[i]], b[node[i]]);
top_dp();
return ;
}
bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序的更多相关文章
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- bzoj 1093 [ZJOI2007]最大半连通子图——缩点+拓扑
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 缩点+拓扑,更新长度的时候维护方案数. 结果没想到处理缩点后的重边,这样的话方案数会算 ...
- 【BZOJ】1093: [ZJOI2007]最大半连通子图(tarjan+拓扑序)
http://www.lydsy.com/JudgeOnline/problem.php?id=1093 两个条件综合起来加上求最大的节点数,那么很明显如果是环一定要缩点. 然后再仔细思考下就是求da ...
- 【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)
[BZOJ1093][ZJOI2007]最大半联通子图(Tarjan,动态规划) 题面 BZOJ 洛谷 洛谷的讨论里面有一个好看得多的题面 题解 显然强连通分量对于题目是没有任何影响的,直接缩点就好了 ...
- [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...
- BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】
题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...
- bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- BZOJ1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...
随机推荐
- 【费用流】【CODEVS】1227 方格取数2
[算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...
- 【CodeForces】708 C. Centroids 树的重心
[题目]C. Centroids [题意]给定一棵树,求每个点能否通过 [ 移动一条边使之仍为树 ] 这一操作成为树的重心.n<=4*10^5. [算法]树的重心 [题解]若树存在双重心,则对于 ...
- 在Perl中使用Getopt::Long模块来接收用户命令行参数
我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...
- python模块之itertools
在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的容器,包含有多个对象.通过调用循环器的next()方法 (__next__()方法,在Python 3.x中),循环器 ...
- 将table导出为excel格式文件
html: <table cellpadding="0" cellspacing="0" class="data_table" id= ...
- 端口扫描———nmap
nmap教程之nmap命令使用示例(nmap使用方法) 浏览:8268 | 更新:2014-03-29 17:23 Nmap是一款网络扫描和主机检测的非常有用的工具.Nmap是不局限于仅仅收集信息和枚 ...
- 响应式设计:根据不同设备引不同css样式
<link rel="stylesheet" media="screen and (max-width:600px)" href="small. ...
- jersey中的 404 Not Found 错误。
把资源定义到com.diandaxia.rest包里 就可以了: 当然也可以使用注册的方式,注册到jersey框架里.当一个类 必须再com.diandaxia.rest 包之外的话,又不想 扩大 自 ...
- Jmeter中的变量(三)
变量(Variables) Jmeter中的变量(参数化)目的是为了提供改变请求变化的机制.比如登录场景,一般不能使用同一个账号做并发操作. 变量的特点 1) JMeter变量对于测试线程而言是局部变 ...
- [你必须知道的.NET]第二十一回:认识全面的null
发布日期:2008.7.31 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 null.nullable.??运算符.null ...