P2272 [ZJOI2007]最大半连通子图
思路
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]最大半连通子图的更多相关文章
- 洛谷 P2272 [ZJOI2007]最大半连通子图 解题报告
P2272 [ZJOI2007]最大半连通子图 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v \in V\),满 ...
- Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)
P2272 [ZJOI2007]最大半连通子图 题意 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v\in V\) ...
- luogu P2272 [ZJOI2007]最大半连通子图
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若 ...
- P2272 [ZJOI2007]最大半连通子图 tarjan+DP
思路:$tarjan+DP$ 提交:1次 题解:首先对于一个强连通分量一定是一个半连通分量,并且形成的半连通分量的大小一定是它的$size$,所以我们先缩点. 这样,我们相当于要在新的$DAG$上找一 ...
- 题解 P2272 【[ZJOI2007]最大半连通子图】
P2272 [ZJOI2007]最大半连通子图 萌新初学Tarjan,在<信息学奥赛一本通-提高篇>中看到这题,看到题解不多,便想发布一篇较为清新简洁的题解.--第5道紫题 题目大意: 定 ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
- BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
- bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2286 Solved: 897[Submit][St ...
- BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
随机推荐
- Vue系列之 => 使用第三方animated.css动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 异常点/离群点检测算法——LOF
http://blog.csdn.net/wangyibo0201/article/details/51705966 在数据挖掘方面,经常需要在做特征工程和模型训练之前对数据进行清洗,剔除无效数据和异 ...
- JavaScript--定时器setTimeout()、clearTimeout(var param)和setInterval()、clearInterval(var param)
1.setTimeout().clearTimeout(var param) setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,只调用一次 clearTimeout() 方法可取 ...
- 【Hive学习之一】Hive简介
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...
- CS131&Cousera图像处理学习笔记 - L5边缘
cs131: http://vision.stanford.edu/teaching/cs131_fall1617/ coursera: https://www.coursera.org/learn/ ...
- Log4J基础详解及示例大全(转)
log4j可以通过使用配置文件的方式进行配置. 配置步骤如下: 1.定义日志组件logger 每个logger都可以拥有一个或者多个appender,每个appender表示一个日志的输出目的地,比如 ...
- 这份书单,给那些想学Hadoop大数据、人工智能的人
一.简单科普类 (文末附下载链接) 1.<人工智能:李开复谈AI如何重塑个人.商业与社会的未来图谱2> 作者:李开复,王咏刚 推荐理由:文章写得一般,但李开复和王永刚老师总结的还可以,算国 ...
- linux mysql主从复制
centos7 安装 mariadb 1 yum 源 -- 配置阿里的 2 rmp 方式 3 源码编译方式 -- 专业DBA 一些知识点: 虚拟环境 不影响 redis/ mariadb/mysq ...
- [转载]js 获取ASP RadioButtonList 选中的值
var planList=document.all ('rblPlanType'); for(var i=1;i<planList.length;i++) { if(plan ...
- java中BufferedImage类的用法
1. BufferedImage是Image的一个子类,Image和BufferedImage的主要作用就是将一副图片加载到内存中. BufferedImage生成的图片在内存里有一个图像缓冲区,利用 ...