题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1093

sol  :一开始理解错题意了QAQ,还莫名其妙写挂了QAQ,调了半天

   首先显然一个强联通分量肯定要么都属于最大半联通子图,要么都不属于

   所以先用tarjan缩点,重建后得到一个DAG

   之后我们可以发现,得到的答案一定是一条链,所以要求最长链的长度和数量

   直接dp即可,记得判重(我挂了好久QAQ)

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. using namespace std;
  6. const int Mx=;
  7. int n,m,p,maxn,ans,cnt,tag,top;
  8. int dfn[Mx],low[Mx],val[Mx],belong[Mx],stk[Mx];
  9. int in[Mx],f[Mx],g[Mx],vis[Mx];
  10. bool instk[Mx];
  11. int tot,head1[Mx],head2[Mx],nxt1[*Mx],ver1[*Mx],nxt2[*Mx],ver2[*Mx];
  12. void add1(int x,int y)
  13. {
  14. nxt1[++tot]=head1[x];
  15. ver1[tot]=y;
  16. head1[x]=tot;
  17. }
  18. void add2(int x,int y)
  19. {
  20. nxt2[++tot]=head2[x];
  21. ver2[tot]=y;
  22. head2[x]=tot;
  23. in[y]++;
  24. }
  25. void tarjan(int x)
  26. {
  27. dfn[x]=low[x]=++cnt;
  28. stk[++top]=x,instk[x]=;
  29. for(int i=head1[x];i;i=nxt1[i])
  30. {
  31. int y=ver1[i];
  32. if(!dfn[y])
  33. tarjan(y),
  34. low[x]=min(low[x],low[y]);
  35. else if(instk[y])
  36. low[x]=min(low[x],dfn[y]);
  37. }
  38. if(low[x]==dfn[x])
  39. {
  40. int now=;tag++;
  41. while(now!=x)
  42. {
  43. now=stk[top--];
  44. instk[now]=;
  45. val[tag]++;
  46. belong[now]=tag;
  47. }
  48. }
  49. }
  50. void rebuild()
  51. {
  52. tot=;
  53. for(int x=;x<=n;x++)
  54. for(int i=head1[x];i;i=nxt1[i])
  55. {
  56. int y=ver1[i];
  57. if(belong[x]!=belong[y])
  58. add2(belong[x],belong[y]);
  59. }
  60. }
  61. void dp()
  62. {
  63. int l=,r=;
  64. for(int i=;i<=tag;i++)
  65. {
  66. if(!in[i]) stk[r++]=i;
  67. f[i]=val[i],g[i]=;
  68. }
  69. while(l!=r)
  70. {
  71. int x=stk[l++];
  72. for(int i=head2[x];i;i=nxt2[i])
  73. {
  74. int y=ver2[i]; in[y]--;
  75. if(!in[y]) stk[r++]=y;
  76. if(vis[y]==x) continue;
  77. if(f[x]+val[y]>f[y])
  78. {
  79. f[y]=f[x]+val[y];
  80. g[y]=g[x];
  81. }
  82. else if(f[x]+val[y]==f[y])
  83. g[y]=(g[x]+g[y])%p;
  84. vis[y]=x;
  85. }
  86. }
  87. }
  88. int main()
  89. {
  90. scanf("%d%d%d",&n,&m,&p);
  91. for(int i=,x,y;i<=m;i++)
  92. {
  93. scanf("%d%d",&x,&y);
  94. add1(x,y);
  95. }
  96. for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
  97. rebuild(); dp();
  98. for(int i=;i<=tag;i++)
  99. {
  100. if(f[i]>maxn) maxn=f[i],ans=g[i];
  101. else if(f[i]==maxn) ans+=g[i],ans%=p;
  102. }
  103. printf("%d\n%d\n",maxn,ans);
  104. return ;
  105. }

bzoj1093【ZJOI2007】最大半联通子图的更多相关文章

  1. bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序

    最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...

  2. 【BZOJ1093】[ZJOI2007]最大半联通子图(Tarjan,动态规划)

    [BZOJ1093][ZJOI2007]最大半联通子图(Tarjan,动态规划) 题面 BZOJ 洛谷 洛谷的讨论里面有一个好看得多的题面 题解 显然强连通分量对于题目是没有任何影响的,直接缩点就好了 ...

  3. [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...

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

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

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

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

  6. BZOJ1093 [ZJOI2007]最大半连通子图

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

  7. bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)

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

  8. bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp

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

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

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

  10. BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)

    发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...

随机推荐

  1. ios 导航视图控制器 跳转

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  2. mysql安装记录

    一.创建mysql用户 useradd mysql 二.解压 tar -zxvf mysql-5.6.38.tar.gz 三.安装依赖包 yum install -y ncurses-devel li ...

  3. Shell脚本使用汇总整理——达梦数据库备份脚本

    Shell脚本使用汇总整理——达梦数据库备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本 ...

  4. (转)规划从 OpenGL ES 2.0 到 Direct3D 的移植

    如果你移植 iOS 或 Android 平台中的游戏,那么你可能需要在 OpenGL ES 2.0 方面进行大量投资.如果你准备将你的图形管道代码库移动到 Direct3D 11 和 Windows ...

  5. 怎样查看web软件例如apache的连接数

    查看连接总数和当前的连接数 netstat -ant | grep $ip:80 | wc -l netstat -ant | grep $ip:80 | grep EST | wc -l 查看IP访 ...

  6. Java List 的深拷贝

    老是会遇到深拷贝与浅拷贝的问题,这里进行了一些測试.代码例如以下: </pre><pre name="code" class="java"&g ...

  7. mongodb安装,库操作,集合操作(表),文档操作(记录)

    安装 1.下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.8-signed.msi 2.如果报没 ...

  8. Python入门基础--变量与基本数据类型

    变量 什么是变量 变量就是变化的量,变就是变化,量用于衡量描述对象的状态 为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序 ...

  9. kubernetes dashboard permission errors

    kubernetes dashboard 的权限错误 warning configmaps is forbidden: User "system:serviceaccount:kube-sy ...

  10. HDU 1506 Largest Rectangle in a Histogram(单调栈、笛卡尔树)

    题意:给定n个连续排列的矩形的高,矩形的宽都为1.问最大矩形覆盖. 例如:n = 7,h[i] = (2 1 4 5 1 3 3),最大覆盖为8. Sample Input 7 2 1 4 5 1 3 ...