思路

tarjan的题目

注意是要选出一个点集而不是边集

第一问就是缩点之后最长链,第二问就是有多少个最长链,注意缩点后连边要去重(不然一个链的方案可能会被统计多次)

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <set>
using namespace std;
int scc_cnt,sccno[100100],sccnum[100100],low[100100],dfn[100100],vis[100100],vis2[100100],dp1[100100],dfs_clock,n,m,MOD;
pair<int,int> dp2[100100];
struct Graph{
int u[1001000],v[1001000],fir[1001000],nxt[1001000],cnt=0;
void addedge(int ui,int vi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
}G1,G2;
stack<int> S;
set<pair<int,int> > S2;
void tarjan(int u){
low[u]=dfn[u]=++dfs_clock;
S.push(u);
vis[u]=true;
for(int i=G1.fir[u];i;i=G1.nxt[i]){
if(!dfn[G1.v[i]]){
tarjan(G1.v[i]);
low[u]=min(low[u],low[G1.v[i]]);
}
else if(vis[G1.v[i]])
low[u]=min(low[u],low[G1.v[i]]);
}
if(dfn[u]==low[u]){
scc_cnt++;
while(1){
int x=S.top();
S.pop();
vis[x]=false;
sccno[x]=scc_cnt;
if(x==u)
break;
}
}
}
void sd(void){
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++){
sccnum[sccno[i]]++;
for(int j=G1.fir[i];j;j=G1.nxt[j]){
int u=sccno[i],v=sccno[G1.v[j]];
if(u>v)
swap(u,v);
if(S2.count(make_pair(u,v)))
continue;
S2.insert(make_pair(u,v));
if(sccno[i]!=sccno[G1.v[j]])
G2.addedge(sccno[i],sccno[G1.v[j]]);
}
}
}
int dfs1(int x){
if(vis[x])
return dp1[x];
vis[x]=true;
for(int i=G2.fir[x];i;i=G2.nxt[i]){
dp1[x]=max(dfs1(G2.v[i]),dp1[x]);
}
dp1[x]+=sccnum[x];
return dp1[x];
}
pair<int,int> dfs2(int x){
if(vis2[x])
return dp2[x];
vis2[x]=true;
dp2[x]=make_pair(0,1);
for(int i=G2.fir[x];i;i=G2.nxt[i]){
pair<int,int> t=dfs2(G2.v[i]);
if(t.first>dp2[x].first){
dp2[x]=t;
}
else if(t.first==dp2[x].first){
dp2[x].second=(dp2[x].second+t.second)%MOD;
}
}
dp2[x].first+=sccnum[x];
return dp2[x];
}
int main(){
scanf("%d %d %d",&n,&m,&MOD);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
G1.addedge(a,b);
}
sd();
int ans=0,ans2=0;
for(int i=1;i<=scc_cnt;i++)
ans=max(ans,dfs1(i));
for(int i=1;i<=scc_cnt;i++){
pair<int,int> t=dfs2(i);
if(t.first==ans)
ans2=(ans2+t.second)%MOD;
}
printf("%d\n%d\n",ans,ans2);
return 0;
}

P2272 [ZJOI2007]最大半连通子图的更多相关文章

  1. 洛谷 P2272 [ZJOI2007]最大半连通子图 解题报告

    P2272 [ZJOI2007]最大半连通子图 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v \in V\),满 ...

  2. Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)

    P2272 [ZJOI2007]最大半连通子图 题意 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v\in V\) ...

  3. luogu P2272 [ZJOI2007]最大半连通子图

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

  4. P2272 [ZJOI2007]最大半连通子图 tarjan+DP

    思路:$tarjan+DP$ 提交:1次 题解:首先对于一个强连通分量一定是一个半连通分量,并且形成的半连通分量的大小一定是它的$size$,所以我们先缩点. 这样,我们相当于要在新的$DAG$上找一 ...

  5. 题解 P2272 【[ZJOI2007]最大半连通子图】

    P2272 [ZJOI2007]最大半连通子图 萌新初学Tarjan,在<信息学奥赛一本通-提高篇>中看到这题,看到题解不多,便想发布一篇较为清新简洁的题解.--第5道紫题 题目大意: 定 ...

  6. BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)

    题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...

  7. BZOJ 1093 [ZJOI2007]最大半连通子图

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1986  Solved: 802[Submit][St ...

  8. bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 897[Submit][St ...

  9. BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )

    WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...

随机推荐

  1. Vue系列之 => 列表动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Vue系列之 => 钩子函数生命周期

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Java多线程-----创建线程的几种方式

       1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体 创建Thread子类的实例,也就是创建 ...

  4. url组成

  5. 【Hive学习之七】Hive 运行方式&权限管理

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  6. linux学习笔记---grep

    先来讲讲grep(搜索过滤) 1.命令格式: grep [option] pattern file 2.命令参数: -a 不要忽略二进制的数据 -A<显示行数>          除了显示 ...

  7. linux系统Centos环境下搭建SVN服务器及权限配置

    linux系统Centos环境下如何搭建SVN服务器以及svnserve.conf.authz.passwd配置文件详细介绍   至于svn的概念,这里就不做详细阐述了,可以自行百度.简单来讲就是一个 ...

  8. OGG 12.3中支持系统procedure复制的几点说明

    如果需要同步系统级别的过程和package,则需要满足以下条件: 要求使用OGG12.3及以后的版本 需要使用oracle db12.2及以后的版本 需要使用集成抽取和集成投递 在DBA_GG_SUP ...

  9. 巧用ELK快速实现网站流量监控可视化

    前言 本文可能不会详细记录每一步实现的过程,但一定程度上可以引领小伙伴走向更开阔的视野,串联每个环节,呈现予你不一样的效果. 业务规模 8个平台 100+台服务器 10+个集群分组 微服务600+ 用 ...

  10. pyglet StaticSource

    for i in range(10): self.player2.queue(pyglet.media.StaticSource(pyglet.media.load('2.mp3')))