这个题,翻译一下题面,就是一个连通图,找他的最长链的数量。。。

所以说方法就比较明显了:tarjan缩点+拓扑+DP

注意也是本题唯一坑点,拓扑DP的时候要考虑重复边的情况。。。

呆码:

#include<iostream>
#include<cstdio>
#define N 100010
#define M 1000010
using namespace std; struct asd{
int nxt;
int to;
} a[M<<],b[M]; int head[M<<],headd[M],t[N],dfn[N],low[N],stack[N];
int num[N],belong[N],tmp[N],f[N],g[N],vis[N];
int sum,number,top,cnt,n,m,mo,mx,ans;
bool use[N]; inline void add(int x,int y)
{
a[++sum].nxt=head[x];
a[sum].to=y;
head[x]=sum;
} inline void bdd(int x,int y)
{
b[++sum].nxt=headd[x];
b[sum].to=y;
headd[x]=sum;
t[y]++;
} inline void tarjan(int u)
{
number++;
dfn[u]=low[u]=number;
stack[++top]=u;
use[u]=;
for(int i=head[u];i;i=a[i].nxt)
{
int v=a[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(use[v])
low[u]=min(low[u],dfn[v]);
}
int v;
if(dfn[u]==low[u])
{
cnt++;
do{
num[cnt]++;
v=stack[top--];
belong[v]=cnt;
use[v]=;
}while(u!=v);
}
} inline void rebuild()
{
for(int i=;i<=n;i++)
for(int j=head[i];j;j=a[j].nxt)
if(belong[i]!=belong[a[j].to])
bdd(belong[i],belong[a[j].to]);
} int main()
{
scanf("%d%d%d",&n,&m,&mo);
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
} for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
sum=; rebuild(); int Head=,Tail=;
for(int i=;i<=cnt;i++)
{
if(!t[i]) tmp[++Tail]=i;
f[i]=num[i]; g[i]=;
}
while(Head<Tail)
{
int now=tmp[++Head];
for(int i=headd[now];i;i=b[i].nxt)
{
int v=b[i].to; t[v]--;
if(!t[v]) tmp[++Tail]=v;
if(vis[v]==now) continue;
if(f[now]+num[v]>f[v])
{
f[v]=f[now]+num[v];
g[v]=g[now];
}
else if(f[now]+num[v]==f[v])
g[v]=(g[v]+g[now])%mo;
vis[v]=now;
}
} for(int i=;i<=cnt;i++)
{
if(f[i]>mx) mx=f[i],ans=g[i];
else if(f[i]==mx) ans=(ans+g[i])%mo;
} printf("%d\n%d",mx,ans);
}

代码

[ZJOI2007]最大半联通子图的更多相关文章

  1. 【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)

    [BZOJ1093][ZJOI2007]最大半联通子图(Tarjan,动态规划) 题面 BZOJ 洛谷 洛谷的讨论里面有一个好看得多的题面 题解 显然强连通分量对于题目是没有任何影响的,直接缩点就好了 ...

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

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

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...

  4. BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)

    题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...

  5. 【BZOJ1093】【ZJOI2007】最大半联通子图 [DP][Tarjan]

    最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 一个有向图G=(V,E)称为 ...

  6. bzoj1093【ZJOI2007】最大半联通子图

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1093 sol  :一开始理解错题意了QAQ,还莫名其妙写挂了QAQ,调了半天 首先显然一个强联 ...

  7. 洛谷 P2272 [ZJOI2007]最大半连通子图 解题报告

    P2272 [ZJOI2007]最大半连通子图 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v \in V\),满 ...

  8. [ZJOI2007]最大半连通子图(Tarjan,拓扑序DP)

    [ZJOI2007]最大半连通子图 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...

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

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1986  Solved: 802[Submit][St ...

随机推荐

  1. 用命令行打开sublime

    在linux下装了linux后默认并不能通过运行命令的方式打开,这就让我们不能像vim一样可以通过 vim <fileName> 来打开文件. 不过我们可以通过把sublime的执行文件放 ...

  2. CentOS 7 MariaDB-MHA

    关于MHA    MHA(Master High Availability)是一款开源的mysql高可用程序,目前在mysql高可用方面是一个相对成熟的解决方案.MHA 搭建的前提是MySQL集群中已 ...

  3. Django框架详细介绍---ORM---图书信息系统专题训练

    from django.db import models # Create your models here. # 书 class Book(models.Model): title = models ...

  4. linux iptables详解(转)

    概述 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成 ...

  5. vue运行时 eslint 报“import/first” WARN deprecated browserslist 问题解决

    vue运行时 eslint 报“import/first”  WARN deprecated browserslist 问题解决 这个信息的意思是导入文件顺序不对,绝对导入应该放在相对导入前面.将绝对 ...

  6. Quartz.net定时任务框架的使用

    一:Nuget添加Quartz.net和Topshelf 二:新建HelloJob类继承IJob public class HelloJob : IJob       {            pub ...

  7. 怎样从外网访问内网Resin

    外网访问内网Resin 本地安装了Resin,只能在局域网内访问,怎样从外网也能访问本地Resin? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Resin 默认安装的Resin端口 ...

  8. 7、Kafka、AMQ、RabbitMQ对比

    Kafka AMQ RabbitMQ 应用场景 AMQ/RabbitMQ Kafka

  9. Java调用第三方接口示范

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...

  10. js自己总结的小东西(打印出来方便学习)

    1.你对angular有哪些认识? 属于mvvm框架,现在非常的火,由谷歌开发出来并维护的框架,为了解决负责业务中ajax的开发痛苦,刚开始结果angular的时候,确实让我有一种耳目一些,原来代码还 ...