思路

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. sql server2000中使用convert来取得datetime数据类型样式(转)

    日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVER ...

  2. Fantasia (点强连通分量建图 + 树形DP)

    简化一下题意,我们先看成一副强连通的图,这时候应该是最简单了,去点任意点都是其他的乘积.那再加强一点难度,改为两个强连通图连接的非强连通图呢?那应该就是找出关键的那个点,并求出两边的乘积.但是一个一个 ...

  3. rest-framework 序列化格式Restful API设计规范

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

  4. 凯撒密码、GDP格式化输出、99乘法表

    1.恺撒密码的编码 s=input('明文:') print('密文:',end='') for i in s: print(chr(ord(i)+3),end='') 附加: print('字符串的 ...

  5. verilog代码基础

    verilog拼接符用法: https://zhidao.baidu.com/question/531343285.html wire [31:0] bit_mask = { {8{be[3]}}, ...

  6. xlrd、xlwt

    一个公司内,销售或者人事都是使用excel来记录员工的信息,所以介绍可操作excel文件的xlrd.xlwt模块. 其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入 ...

  7. xmldecoder漏洞

    https://blog.csdn.net/youanyyou/article/details/78990312

  8. 设计模式之Singleton(单态)(转)

    定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有, singleton能够被状 ...

  9. 转:【专题五】TCP编程

    前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议——TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了. ...

  10. 区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统

    区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统 区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统