bzoj1093【ZJOI2007】最大半联通子图
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1093
sol :一开始理解错题意了QAQ,还莫名其妙写挂了QAQ,调了半天
首先显然一个强联通分量肯定要么都属于最大半联通子图,要么都不属于
所以先用tarjan缩点,重建后得到一个DAG
之后我们可以发现,得到的答案一定是一条链,所以要求最长链的长度和数量
直接dp即可,记得判重(我挂了好久QAQ)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=;
int n,m,p,maxn,ans,cnt,tag,top;
int dfn[Mx],low[Mx],val[Mx],belong[Mx],stk[Mx];
int in[Mx],f[Mx],g[Mx],vis[Mx];
bool instk[Mx];
int tot,head1[Mx],head2[Mx],nxt1[*Mx],ver1[*Mx],nxt2[*Mx],ver2[*Mx];
void add1(int x,int y)
{
nxt1[++tot]=head1[x];
ver1[tot]=y;
head1[x]=tot;
}
void add2(int x,int y)
{
nxt2[++tot]=head2[x];
ver2[tot]=y;
head2[x]=tot;
in[y]++;
}
void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
stk[++top]=x,instk[x]=;
for(int i=head1[x];i;i=nxt1[i])
{
int y=ver1[i];
if(!dfn[y])
tarjan(y),
low[x]=min(low[x],low[y]);
else if(instk[y])
low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x])
{
int now=;tag++;
while(now!=x)
{
now=stk[top--];
instk[now]=;
val[tag]++;
belong[now]=tag;
}
}
}
void rebuild()
{
tot=;
for(int x=;x<=n;x++)
for(int i=head1[x];i;i=nxt1[i])
{
int y=ver1[i];
if(belong[x]!=belong[y])
add2(belong[x],belong[y]);
}
}
void dp()
{
int l=,r=;
for(int i=;i<=tag;i++)
{
if(!in[i]) stk[r++]=i;
f[i]=val[i],g[i]=;
}
while(l!=r)
{
int x=stk[l++];
for(int i=head2[x];i;i=nxt2[i])
{
int y=ver2[i]; in[y]--;
if(!in[y]) stk[r++]=y;
if(vis[y]==x) continue;
if(f[x]+val[y]>f[y])
{
f[y]=f[x]+val[y];
g[y]=g[x];
}
else if(f[x]+val[y]==f[y])
g[y]=(g[x]+g[y])%p;
vis[y]=x;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
add1(x,y);
}
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
rebuild(); dp();
for(int i=;i<=tag;i++)
{
if(f[i]>maxn) maxn=f[i],ans=g[i];
else if(f[i]==maxn) ans+=g[i],ans%=p;
}
printf("%d\n%d\n",maxn,ans);
return ;
}
bzoj1093【ZJOI2007】最大半联通子图的更多相关文章
- bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...
- 【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]最大半连通子图(tarjan dp)
题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...
- 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)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- 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 ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
- BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)
发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...
随机推荐
- java 字符串中是否有数字
http://www.cnblogs.com/zhangj95/p/4198822.html http://www.cnblogs.com/sunzn/archive/2013/07/12/31865 ...
- Bootstrap 历练实例-轮播(carousel)插件方法
方法 下面是一些轮播(Carousel)插件中有用的方法: 方法 描述 实例 .carousel(options) 初始化轮播为可选的 options 对象,并开始循环项目. $('#identifi ...
- eclipse关闭无用启动项,降低内存占用
1,我使用的eclipse版本 2.打开windows-->preference 3,勾选掉无用的启动项,我的已经去掉过了, 4,重启eclipse,如果操作后导致一些必须的功能不能用了,可以点 ...
- getchar输入多行字符,原格式输出(包含换行符)
#include<stdio.h> int main() { FILE fp; ]; ; char ch; while((ch=getchar())!=EOF){ str[k++]=ch; ...
- 二十三、MySQL 事务
MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...
- 初学js之多组图片切换实例
需求是以上效果展示.话不多说,直接代码显示,不涉及代码优化.已实现功能为目的. 先看html部分: <body> <div class="dream" id=&q ...
- The Tower of Babylon UVA - 437 DAG上的动态规划
题目:题目链接 思路:每个方块可以用任意多次,但因为底面限制,每个方块每个放置方式选一个就够了,以x y为底 z 为高,以x z为底 y 为高,以y z为底 x为高,因为数据量很小,完全可以把每一种当 ...
- CSU 1997-Seating Arrangement
Seating Arrangement Mr. Teacher老师班上一共有n个同学,编号为1到n. 在上课的时候Mr. Teacher要求同学们从左至右按1, 2, -, n的顺序坐成一排,这样每个 ...
- ajax跨域请求的处理
跨域的情形有很多种,网上有人给出了一份表格, 表格中标识为”不允许”通信的情况都属于跨域.实际网络服务中需要跨域的情况确实存在,于是开发者们提供了一种解决方案,就是使用jsonp格式进行数据交互,它不 ...
- dotnet core 2.2 安装后在vs2017中无法选择 dotnet core 2.2 为目标框架
可能有效的解决方案: 无法完全保证有效,因为我本地装上没问题,只帮同事解决过一次,貌似有效 方案就是多装几个 .net core 2.2.xxx 版本,然后可能就正常识别了. 在安装之前,先把 vs ...