P2272 [ZJOI2007]最大半连通子图

首先缩点 缩完点后存在大量重边 排一遍序去重

然后重新建一个新图 再从入度为0的点一个一个搜 统计并更新答案

感觉过不了多久我再看就看不懂了 一大坨变量

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int N=100000+5,M=1000000+5,inf=0x3f3f3f3f;
 5 int n,m,mod,in[N],out[N],cntp[N],dis[N],ans1=0,ans2=0;
 6 int idx=0,Bcnt=0,dfn[N],low[N],bl[N],size[N];
 7 bool inst[N];
 8 stack<int>s;
 9 template<class t>void rd(t &x){
10     x=0;int w=0;char ch=0;
11     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
12     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
13     x=w?-x:x;
14 }
15
16 struct node{int u,v;}nod[M];
17 int head[N],tot=0,cnte=0;
18 struct edge{int u,v,nxt;}e[M];
19 void add(int u,int v){
20     e[++tot]=(edge){u,v,head[u]};head[u]=tot;
21 }
22 void tarjan(int u){
23     dfn[u]=low[u]=++idx;
24     s.push(u),inst[u]=1;
25     for(int i=head[u],v;i;i=e[i].nxt){
26         v=e[i].v;
27         if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
28         else if(inst[v]&&dfn[v]<low[u]) low[u]=dfn[v];
29     }
30     if(low[u]==dfn[u]){
31         ++Bcnt;
32         int v;
33         do{
34             v=s.top(),s.pop();
35             bl[v]=Bcnt,++size[Bcnt],inst[v]=0;
36         }while(u!=v);
37     }
38 }
39
40 bool cmp(node a,node b){return a.u==b.u?a.v<b.v:a.u<b.u;}
41 int head2[N],tot2;
42 struct edge2{int v,nxt;}e2[M];
43 void add2(int u,int v){
44     e2[++tot2]=(edge2){v,head2[u]};head2[u]=tot2;
45 }
46 bool vis[N];
47 void dfs(int u){
48     vis[u]=1;
49     if(!out[u]){
50         dis[u]=size[u],cntp[u]=1;
51         ans1=max(ans1,dis[u]);
52         return;
53     }
54     for(int i=head2[u],v;i;i=e2[i].nxt){
55         v=e2[i].v;
56         if(!vis[v]) dfs(v);
57         if(dis[u]<dis[v]+size[u]) dis[u]=dis[v]+size[u],cntp[u]=cntp[v]%mod;
58         else if(dis[u]==dis[v]+size[u]) cntp[u]=(cntp[u]+cntp[v])%mod;
59         ans1=max(ans1,dis[u]);
60     }
61 }
62
63 int main(){
64     //freopen("in.txt","r",stdin);
65     rd(n),rd(m),rd(mod);
66     for(int i=1,u,v;i<=m;++i) rd(u),rd(v),add(u,v);
67     memset(dfn,0,sizeof(dfn));
68     for(int i=1;i<=n;++i)
69     if(!dfn[i]) tarjan(i);
70     for(int i=1;i<=tot;++i)
71     if(bl[e[i].u]!=bl[e[i].v]) nod[++cnte].u=bl[e[i].u],nod[cnte].v=bl[e[i].v];
72     sort(nod+1,nod+1+cnte,cmp);
73     for(int i=1;i<=cnte;++i)
74     if(nod[i].u!=nod[i-1].u||nod[i].v!=nod[i-1].v)
75     add2(nod[i].u,nod[i].v),++in[nod[i].v],++out[nod[i].u];
76     for(int i=1;i<=Bcnt;++i)
77     if(!in[i]&&!vis[i]) dfs(i);
78     for(int i=1;i<=Bcnt;++i)
79     if(dis[i]==ans1) ans2=(ans2+cntp[i])%mod;
80     printf("%d\n%d",ans1,ans2);
81     return 0;
82 }

转载于:https://www.cnblogs.com/lxyyyy/p/11159909.html

【luogu2272】 [ZJOI2007]最大半连通子图 [tarjan 缩点][拓扑排序]相关推荐

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

    1093: [ZJOI2007]最大半连通子图 Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 ...

  2. 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)

    这时yxc上课时讲解的截图. 一般用到tarjan算法的题目步骤都非常相似: tarjan算法 缩点,建图(这里要判重) 按照拓扑序递推(这里缩点以后逆向就已经是拓扑序了)/ 循环遍历新图求解答案. ...

  3. bzoj 2330 / AcWing 368 银河 差分约束系统+tarjan缩点+拓扑排序

    怎么最近bzoj一直上不了,莫非是挂了? AcWing的地址:https://www.acwing.com/problem/content/370/ 题意: 银河中的恒星浩如烟海,但是我们只关注那些最 ...

  4. P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】

    正题 题目链接:https://www.luogu.com.cn/problem/P2272 题目大意 半连通图定义为任意两个点(u,v)(u,v)(u,v)满足uuu可以到vvv或vvv可以到uuu ...

  5. tyvj——P3524 最大半连通子图

    P3524 最大半连通子图 时间: 3000ms / 空间: 165536KiB / Java类名: Main 描述 输入格式 第一行包含两个整数N,M,X.N,M分别表示图G的点数与边数,X的意义如 ...

  6. BZOJ 1093 ZJOI 2007 最大半连通子图 强联通分量+拓扑图DP

    今天是放假的第一天(不说什么废话了) 什么是半连通子图?就是此图中包含的所有点两两点之间至少有一条单向路径. 题目问了两个问题 1.最大半连通子图的大小 2.最大半连通子图的个数 好了,这个问题看上去 ...

  7. 洛谷P4742(tarjan缩点+拓扑DP)

    https://www.luogu.org/problemnew/show/P4742 题目背景 [Night - 20:02[Night−20:02 P.M.]P.M.] 夜空真美啊--但是--快要 ...

  8. BZOJ 1924 [Sdoi2010]所驼门王的宝藏 tarjan缩点+拓扑DP

    题意: 一个r*c的图中,有n个宫殿. 每个宫殿有一个类型. 类型1:可以到达他所在的行的任意宫殿. 类型2:可以到达他所在的列的任意宫殿. 类型3:可以到达他四周八个格子的任意宫殿. 现在你从任意一 ...

  9. bzoj2208 [Jsoi2010]连通数 强连通分量缩点+拓扑排序+bitset

    Description 对于100%的数据,N不超过2000. Solution 容易想到要tarjan缩点按拓扑序递推,但是去重的步骤不好弄 C++STL中有bitset,用这个当成二进制按位状压即 ...

  10. POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)

    [题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...

最新文章

  1. 科研指导:机器学习与自然语言处理
  2. leetcode算法题--队列的最大值
  3. Hydra暴力破解工具的用法
  4. oracle 查看监听命令_linux下使用Oracle常用命令
  5. 用matlab时提示数据写入文件期间被裁剪_用C语言简单开发学生成绩管理系统
  6. YSlow[转:大众点评]
  7. Python: classmethod staticmethod 区别
  8. 【MySQL】MySQL 查询优化器的提示(hint)
  9. 正确理解TensorFlow中的logits
  10. linux网卡流量定时记录脚本crontab与手动执行结果不一致问题处理
  11. 计算机财务模型管理实验内容,计算机财务管理实验报告详细分解.doc
  12. 计算机论文外文翻译,计算机专业毕业论文外文翻译2篇
  13. 搜狗主动推送python脚本(自动登录免验证码)
  14. GDS List内容详情
  15. cross_val_score 如何传入early_stopping_rounds等参数 用于 fit
  16. 终于搞清前端和后端的区别啦!原来是这样的
  17. VMWare虚拟磁盘40G磁盘空间爆满后如何扩容到120G
  18. 笔记本锁定计算机怎么解锁,笔记本电脑键盘怎么解锁呢
  19. android的权限一览表和RGB颜色对照表
  20. 如何才能成为年薪百万的编程高手?

热门文章

  1. 玩转 Java 动态编译,太秀了~!
  2. 2021 年 338 道架构技术面试大厂高频题汇总(附答案详解)
  3. AI技术已经如此逆天了,该有时间学学AI了
  4. 一个3年工作经验的Web工程师的经验之谈
  5. 薄荷Toolbar(ActionBar)的适配方案
  6. ubuntu13.10安装mysql_Ubuntu 10.10 源码安装MySQL 5.1.34
  7. js获取html中div里的标签id_【学废了】HTML初步
  8. linux安装postgresql数据库
  9. 吴裕雄 python 神经网络——TensorFlow 花瓣分类与迁移学习(3)
  10. LeetCode 893 Groups of Special-Equivalent Strings 解题报告