Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]
大意:
缩点后转为求最长链的长度和最长链的个数
思路:
看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题
代码:
如下
#include <cstdio>
#include <iostream>
#include <memory.h>
#define r(x) x=read()
#define MAXX 100005
#define MIN(a,b) (a<b?a:b)
#define MAX(a,b) (a>b?a:b)
#define re register
using namespace std;
typedef long long ll;
int read()
{
char ch=;int w=;
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){w=w*+ch-'';ch=getchar();}
return w;
}
int low[MAXX],dfn[MAXX],k,id[MAXX],num,top,sta[MAXX],du[MAXX];
int h2[MAXX],h[MAXX],u,to,cnt,book[MAXX],heap,sta2[MAXX];
int X,dp[MAXX],ans,w[MAXX],ans2[MAXX];
int n,m;
struct edge{int to,nex;}e[MAXX<<],e2[MAXX<<];
void add(int u,int to,int x)
{
cnt++;
if(x==) {e2[cnt]=(edge){to,h2[u]};h2[u]=cnt;}
if(x==) {e[cnt]=(edge){to,h[u]};h[u]=cnt;}
}
void tarjan(int now)
{
low[now]=dfn[now]=++k;
sta[++top]=now;
for(int i=h2[now];i;i=e2[i].nex)
{
if(!dfn[e2[i].to])
tarjan(e2[i].to),low[now]=MIN(low[now],low[e2[i].to]);
else
if(!id[e2[i].to])
low[now]=MIN(low[now],dfn[e2[i].to]);
}
if(dfn[now]==low[now])
{
id[now]=++num;
while(sta[top]!=now){id[sta[top]]=num;--top;}
top--;
}
}
int main()
{
r(n),r(m),r(X);
for(re int i=;i<=m;++i)
r(u),r(to),add(u,to,);
for(re int i=;i<=n;++i)
if(!dfn[i])
tarjan(i);
for(re int i=;i<=n;++i)
w[id[i]]++;
cnt=;
for(re int i=;i<=n;++i)
for(re int j=h2[i];j;j=e2[j].nex)
{
int y=id[e2[j].to],x=id[i];
if(x!=y) add(x,y,),du[y]++;
}
for(re int i=;i<=num;++i)
if(!du[i]) sta[++top]=i,dp[i]=w[i],ans2[i]=;
for(re int i=;i<=top;++i)
{
int x=sta[i];
for(re int j=h[x];j;j=e[j].nex)
{
du[e[j].to]--;
if(du[e[j].to]==) sta[++top]=e[j].to;
if(book[e[j].to]) continue;
book[e[j].to]=,sta2[++heap]=e[j].to;
if(dp[e[j].to]<dp[x]+w[e[j].to])
dp[e[j].to]=dp[x]+w[e[j].to],ans2[e[j].to]=;
if(dp[e[j].to]==dp[x]+w[e[j].to])
ans2[e[j].to]=(ans2[e[j].to]+ans2[x])%X;
}
while(heap){book[sta2[heap]]=;heap--;}
ans=MAX(ans,dp[x]);
}
ll anse=;
for(int i=;i<=num;++i)
if(dp[i]==ans) anse=(anse+ans2[i])%X;
printf("%d\n%lld",ans,anse);
return ;
}
Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]的更多相关文章
- [BZOJ]1093 最大半连通子图(ZJOI2007)
挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- Tarjan水题系列(3):HNOI2006 潘多拉的魔盒
题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...
- Tarjan水题系列(2):HNOI2012 矿场搭建
题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...
- Tarjan水题系列(1):草鉴定Grass Cownoisseur [USACO15JAN]or[luogu P3119]
题目如下: 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后回到1号草场.她想经过尽可能多的草场,贝 ...
- bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- 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' ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
随机推荐
- Nowcoder Playing Games ( FWT 优化 DP && 博弈论 && 线性基)
题目链接 题意 : 给出 N 个数.然后问你最多取出多少石子使得在 NIM 博弈中.后手必胜 分析 : Nim 博弈模型,后手必胜当且仅当各个堆的石子的数目的异或和为 0 转化一下.变成最少取多少石 ...
- CSP2019-S2参赛总结 暨 近期学习反思
前言 岁月不居,时节如流.眨眼间,2019的联赛就已经落下帷幕了,回忆这一年的学习,有许许多多的事情想写下来.趁联赛结果还未出来,赶紧写下这篇文章,以记录我这段时间的学习和生活. "你怎么又 ...
- Ubuntu18.04安装rabbitvcs svn图形化客户端和简单实用
1.1 自带source源里面查找rabbitvcs信息 sudo apt search rabbitvcs 1.2 安装rabbitvcs sudo apt install rabbitvcs- ...
- web服务基础
Web服务基础 用户访问网站的基本流程 我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等. 当我们输入www.oldboyedu.com/时候,很快就能看到 ...
- Hibernate理解?
(1)Hibernate是对象关系映射框架,对JDBC进行非常轻量级的对象封装,是全自动的ORM框架,可以自动生成SQL语句.自动执行. (2)语言特点 <1>将对数据库的操作转换为对Ja ...
- GreyMagic
hearthbuddy中的一段代码 // Token: 0x06001A79 RID: 6777 RVA: 0x000DD024 File Offset: 0x000DB224 internal In ...
- 全面解读php-引用变量(&)
本文讲述引用传值的核心原理,看完即可扫清一切和引用传值相关的内容,不会了记得画图. 一.memory_get_usage的使用 传值赋值 // 定义一个变量 $a = range(0, 10000); ...
- Android 获取视频照片与刷新媒体库
1.获取本地所有视频 public void getLoadMedia() { Cursor cursor = UILApplication.instance.getApplicationContex ...
- Android共享元素场景切换动画的实现
安卓5.0系统引入了共享元素,能做出非常炫酷的场景切换效果,这让人非常兴奋同时非常蛋疼,因为低版本没法使用啊,所以今天就跟大家分享一下自己写的一个库,其实只有2个文件而已就可以兼容安卓5.0以下的版本 ...
- idea 编译 netty 源码
git clone netty 源码,运行 example 报错 全量 mvn compile -DskipTests=true 后,依然报错 手动在 netty-buffer 模块中添加对应的依赖 ...