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

所以说方法就比较明显了: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. C++重载操作符自增自减

    #include <iostream> using namespace std; class Test { friend ostream& operator<<(ost ...

  2. Sql 按照指定天数时间段查询

    BEGIN TRY DECLARE @BeginTime DATETIME='2017-02-01' DECLARE @EndTime DATETIME='2017-03-3 23:59:59' -- ...

  3. 第四篇——Struts2的引入多个配置文件

    引入多个配置文件 在Struts2配置文件中使用include可引入多个配置文件. 项目实例 1.项目结构 2.pom.xml <project xmlns="http://maven ...

  4. 【Spark-core学习之六】 Spark资源调度和任务调度

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  5. 【运维技术】redis(一主两从三哨兵模式搭建)记录

    redis(一主两从三哨兵模式搭建)记录 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也包含我自己,能够节省对应的时间. 软件架构: 生产环境使用三台 ...

  6. ArrayList去重

    1.利用HashSet(不保证元素顺序一致) HashSet不会存在相同的元素,可以利用这一点去除List中的重复元素 List<String> beforeList = new Arra ...

  7. mysql查询语句and,or

    where查询里,常用到and,or and SELECT field1, field2,...fieldN FROM table_name1, table_name2... WHERE condit ...

  8. Python Redis string

    String操作,redis中的String在在内存中按照一个name对应一个value来存储.如图: set(name, value, ex=None, px=None, nx=False, xx= ...

  9. Python Redis 发布订阅

    发布者:服务器 订阅者:Dashboad和数据处理 频道主逻辑 import redis class RedisHelper: def __init__(self): # 链接服务端 self.__c ...

  10. 更改redhat7 yum源为centos

    1. 替换原系统中yum包, 检查初始的yum包有哪些 rpm -qa |grep yum 2. 删除原始的yum包. rpm -qa|grep yum|xargs rpm -e --nodeps 3 ...