[ZJOI2007]最大半联通子图
这个题,翻译一下题面,就是一个连通图,找他的最长链的数量。。。
所以说方法就比较明显了: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]最大半联通子图的更多相关文章
- 【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)
[BZOJ1093][ZJOI2007]最大半联通子图(Tarjan,动态规划) 题面 BZOJ 洛谷 洛谷的讨论里面有一个好看得多的题面 题解 显然强连通分量对于题目是没有任何影响的,直接缩点就好了 ...
- bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...
- [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
- 【BZOJ1093】【ZJOI2007】最大半联通子图 [DP][Tarjan]
最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 一个有向图G=(V,E)称为 ...
- bzoj1093【ZJOI2007】最大半联通子图
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1093 sol :一开始理解错题意了QAQ,还莫名其妙写挂了QAQ,调了半天 首先显然一个强联 ...
- 洛谷 P2272 [ZJOI2007]最大半连通子图 解题报告
P2272 [ZJOI2007]最大半连通子图 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v \in V\),满 ...
- [ZJOI2007]最大半连通子图(Tarjan,拓扑序DP)
[ZJOI2007]最大半连通子图 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
随机推荐
- 深入探讨java类加载器
概览 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 ...
- 18 os/os.path模块中关于文件/目录常用的函数使用方法 (转)
os模块中关于文件/目录常用的函数使用方法 函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名('. ...
- (Review cs231n) Optimized Methods
Mini-batch SGD的步骤: 1.Sample a batch of data 2.Forward prop it through the graph,get loss 3.backprop ...
- Idea 提交代码到码云(提交到github也大同小异)
1.首先下载安装git,下载地址https://git-scm.com/download/win.按默认选择安装即可,不成功的自行百度 2.安装完成后双击git.exe,调出命令界面(此处需要自己去申 ...
- vue中父子组件之间的传值、非父子组件之间的传值
在Vue实例中每个组件之间都是相互独立的,都有自己的作用域,所以组件之间是不能直接获取数据.在项目开发中一个组件可能需要获取另一个组件的值,我们可以通过其他方法间接的获取.所以,获取的方法有以下几种: ...
- 单元测试系列之七:Sonar 数据库表关系整理一(rule相关)
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/7510072.html 简介:Sonar ...
- 剑指offer 04:重构二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- C#关于多线程及线程同步 lock锁的应用
Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...
- 《Visual C# 从入门到精通》第二章方法和作用域——读书笔记
第2章 方法和作用域 2.1创建方法 方法是一个基本的,强大的编程机制.可视为函数或者子程序相似的东西. 方法名是个有意义的标识符. 方法主体包含方法被调用时实际执行的语句. 声明一个方法的实例如下: ...
- MVC强类型视图,详细信息展示【五】
一.在MVC三种讲到两种后端发送数据到前端的方法,今天讲的是第三种,发送过去的方法 [强类型视图]. 1. 强类型视图,就是指在传递的过程中只能传递一种类型的数据到该视图中,就比如默认的传递的数据类型 ...