题目

大意

缩点后转为求最长链的长度和最长链的个数

思路:

看懂题就会做系列 长度和个数都可以拓扑排序后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]的更多相关文章

  1. [BZOJ]1093 最大半连通子图(ZJOI2007)

    挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...

  2. Tarjan水题系列(4):HAOI2010 软件安装

    题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi​的磁盘空间,它的价值为Vi​.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi​的和最大). ...

  3. Tarjan水题系列(3):HNOI2006 潘多拉的魔盒

    题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...

  4. Tarjan水题系列(2):HNOI2012 矿场搭建

    题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...

  5. Tarjan水题系列(1):草鉴定Grass Cownoisseur [USACO15JAN]or[luogu P3119]

    题目如下: 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后回到1号草场.她想经过尽可能多的草场,贝 ...

  6. bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划

    一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...

  7. BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】

    题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...

  8. BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)

    题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...

  9. 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图

    思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...

随机推荐

  1. jquery disabled选择器 语法

    jquery disabled选择器 语法 作用:disabled 选择器选取所有禁用的表单元素.大理石平台价格表 语法:$(":disabled") jquery disable ...

  2. jquery input选择器 语法

    jquery input选择器 语法 作用::input 选择器选取表单元素.该选择器同样适用于 <button> 元素.大理石平台价格表 语法:$(":input") ...

  3. 如何安装 Angular CLI 并且检查 CLI 的版本

    想在系统中安装 Angular CLI ,如何进行安装并且如何检查 CLI 的版本? 可以使用命令: npm install -g @angular/cli 进行安装. 使用命令 ng version ...

  4. HGOI 20190711 题解

    Problem A 矩阵第K小数 给定一个$n \times m$的矩阵,位置$A_{i,j}  = i\times j$, 给出$Q$个询问,每一次查询矩阵中第$Q_i$小的数是多少. 对于100% ...

  5. unittest详解(五) 引入装饰器@classmethod

    我们知道setUp()和setDown()的作用是在每条测试用例执行前准备测试环境以及用例测试结束后恢复测试环境,如果我们执行的测试类下所有测试用例的环境准备和环境复原的操作都是一样的,那么我们就没必 ...

  6. Unity3D_(插件)DOTween动画插件

    使用DOTween动画插件来实现物体的移动动画 Learn 一.DOTween插件对变量的动画 二.控制Cube和UI面板的动画 三.动画的快捷播放方式 四.动画的前放和后放 五.From Tween ...

  7. wannafly 挑战赛9 D 造一造 (卡特兰数)

    链接:https://www.nowcoder.com/acm/contest/71/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...

  8. [CSP-S模拟测试]:点亮(状压DP+树上背包DP)

    题目传送门(内部题121) 输入格式 第一行,一个正整数$n$. 第二行,$n-1$个正整数$p_2,p_3,...,p_n$.保证$p_u$是在$1$到$u-1$中等概率随机选取的. 接下来$n$行 ...

  9. Android 6.0动态权限申请

    转载(Android 6.0 动态权限申请简单简洁优雅的处理方式): https://blog.csdn.net/lin_dianwei/article/details/79025324

  10. [NLP] 语义网络与知识图谱入门(二)

    语义网络与知识图谱入门(二) OWL 本体声明 owl用owl:Ontology来声明一个本体.rdf:about属性为本体提供一个名称或引用.根据标准,当rdf:about属性的值为"&q ...