传送门

先将原图缩点,缩掉之后的点权就是连通块大小。

然后用拓扑排序统计最长链数就行了。

自己yyyyyy了一下一个好一点的统计方法。

把所有缩了之后的点都连向一个虚点。

然后再跑拓扑,这样最后虚点的答案就是要求的。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=1e5+5,M=1e6+5;
int low[N],tot=0,dfn[N],n,m,mod,first[N],cnt=0,stk[N],top=0,col[N],sig=0,val[N],f[N],g[N],du[N],pred[N];
bool vis[N],in[N];
struct edge{int v,next;}e[M<<1];
vector<int>G[N];
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline void tarjan(int p){
	dfn[p]=low[p]=++tot,stk[++top]=p,in[p]=1;
	for(int i=first[p];i;i=e[i].next){
		int v=e[i].v;
		if(!dfn[v])tarjan(v),low[p]=min(low[p],low[v]);
		else if(in[v])low[p]=min(low[p],dfn[v]);
	}
	if(dfn[p]==low[p]){
		++sig;
		while(1){
			int x=stk[top--];
			++val[col[x]=sig],in[x]=0;
			if(x==p)break;
		}
	}
}
inline void topsort(){
	queue<int>q;
	for(int i=1;i<=sig;++i)if(!du[i])f[i]=val[i],g[i]=1,q.push(i);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=G[x].size()-1;~i;--i){
			int v=G[x][i];
			--du[v];
			if(!du[v])q.push(v);
			if(pred[v]==x)continue;
			if(f[x]+val[v]>f[v])f[v]=f[x]+val[v],g[v]=g[x];
			else if(f[x]+val[v]==f[v])g[v]=(g[v]+g[x])%mod;
			pred[v]=x;
		}
	}
}
int main(){
	freopen("lx.in","r",stdin);
	n=read(),m=read(),mod=read();
	for(int i=1,u,v;i<=m;++i)u=read(),v=read(),add(u,v);
	for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i);
	for(int i=1;i<=sig;++i)G[i].push_back(sig+1),++du[sig+1];
	for(int i=1;i<=n;++i)for(int j=first[i];j;j=e[j].next)if(col[i]^col[e[j].v])G[col[i]].push_back(col[e[j].v]),++du[col[e[j].v]];
	topsort(),cout<<f[sig+1]<<'\n'<<g[sig+1];
	return 0;
}

2018.11.06 bzoj1093: [ZJOI2007]最大半连通子图(缩点+拓扑排序)的更多相关文章

  1. bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)

    Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...

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

    最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...

  3. bzoj 1093: [ZJOI2007]最大半连通子图【tarjan+拓扑排序+dp】

    先tarjan缩成DAG,然后答案就变成了最长链,dp的同时计数即可 就是题面太唬人了,没反应过来 #include<iostream> #include<cstdio> #i ...

  4. bzoj 1093 [ZJOI2007]最大半连通子图——缩点+拓扑

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 缩点+拓扑,更新长度的时候维护方案数. 结果没想到处理缩点后的重边,这样的话方案数会算 ...

  5. BZOJ1093 [ZJOI2007]最大半连通子图

    Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...

  6. 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 ...

  7. BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】

    题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...

  8. BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)

    题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...

  9. 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图

    思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...

随机推荐

  1. Handler Runnable 自动执行 循环 连续 延时

    这是一种可以创建多线程消息的函数使用方法:1,首先创建一个Handler对象 Handler handler=new Handler(); 2,然后创建一个Runnable对象Runnable run ...

  2. TZOJ 5291 游戏之合成(快速幂快速乘)

    描述 zzx和city在玩一款小游戏的时候,游戏中有一个宝石合成的功能,需要m个宝石才可以合成下一级的宝石(例如需要m个1级宝石才能合成2级宝石). 这时候zzx问city说“我要合成A级宝石需要多少 ...

  3. MySQL-查缺补漏

    MySQL show create table tablename #查看表设计代码数据 show create table tablename/G #同上 desc tablename # 查看表数 ...

  4. 记录下ABAP开发的一些东西(T-code居多)Updated to markdown

    几个TCODE se38 开发program,report: sa38 只运行program se37 开发function: se11/se16 管理数据字典/数据表: ko03 Internal ...

  5. java 基础之--java动态代理

    1.抽象角色:声明真实对象与代理对象的共同接口: 2.代理角色:相当于中介的作用,bridge,内部包含对真实角色的reference,在执行真实操作对象时,附加其他操作,相当于对真实角色的封装: 3 ...

  6. day 18 类,对象

    类,对象: 类 具有相似功能的一类事物,人类,犬类,猫类等等. 对象: 类的具体表现 面向对象: 1.第一个优点:面向对象是一类相似功能函数的集合体 更清晰化,更规范化 class LoginHand ...

  7. 2018.3.15 css课外小知识

    1, 如果手动写动画, 最小的时间间隔是多久 为什么 多数显示器默认频率是60Hz  1s刷新60次  所以理论最小是1/60*1000ms=16.7ms 2. display:inline-bloc ...

  8. Web API中常用Filter的执行顺序举例讲解

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  9. Jenkins发送邮件,邮件正文嵌套的html中文显示乱码

    解决方案: 1.添加系统变量.变量名:JAVA_TOOL_OPTIONS变量值:-Dfile.encoding=UTF8 2.打开jenkins,系统管理--系统设置,在全局属性处勾选Environm ...

  10. 转:css知多少(12)——目录

    <css知多少>系列就此完结了.常来光顾的朋友可能会觉得突然:css的知识点还有很多,怎么突然就完了,还没讲完呢?这样说是对的.不过凡事都有一个定位,如果盲目求多,定位模糊,那样就没有目的 ...