Description

  一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意
两点u,v,存在一条u到v的有向路径或者从v到u的有向路径。若G'=(V',E')满足V'?V,E'是E中所有跟V'有关的边,
则称G'是G的一个导出子图。若G'是G的导出子图,且G'半连通,则称G'为G的半连通子图。若G'是G所有半连通子图
中包含节点数最多的,则称G'是G的最大半连通子图。给定一个有向图G,请求出G的最大半连通子图拥有的节点数K
,以及不同的最大半连通子图的数目C。由于C可能比较大,仅要求输出C对X的余数。

Input

  第一行包含两个整数N,M,X。N,M分别表示图G的点数与边数,X的意义如上文所述接下来M行,每行两个正整
数a, b,表示一条有向边(a, b)。图中的每个点将编号为1,2,3…N,保证输入中同一个(a,b)不会出现两次。N ≤1
00000, M ≤1000000;对于100%的数据, X ≤10^8

Output

  应包含两行,第一行包含一个整数K。第二行包含整数C Mod X.

Sample Input

6 6 20070603

1 2

2 1

1 3

2 4

5 6

6 4

Sample Output

3

3
 
——————————————————————————————————————————————
题目大意:
一个有向图,求图中的最大半连通子图的点数和方案数。
首先,对图进行缩点。因为环内的点肯定是连通的。
然后,图就变成了有向无环图,这样在上面进行拓扑排序。
最后,在拓扑序上进行DP。
只得了40分,后来看别的程序才发现问题,注意去重边。
——————————————————————————————————————————————
  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int maxn=1e5+10,maxm=1e6+10;
  4. 4 struct edge
  5. 5 {
  6. 6 int u,v,nxt;
  7. 7 }e[maxm],ee[maxm];
  8. 8 int head[maxn],js,headd[maxn],jss;
  9. 9 void addage(edge e[],int head[],int &js,int u,int v)
  10. 10 {
  11. 11 e[++js].u=u;e[js].v=v;
  12. 12 e[js].nxt=head[u];head[u]=js;
  13. 13 }
  14. 14 int dfn[maxn],low[maxn],cnt,st[maxn],top,lt[maxn],lts,ltn[maxn];
  15. 15 void tarjan(int u)
  16. 16 {
  17. 17 dfn[u]=low[u]=++cnt;
  18. 18 st[++top]=u;
  19. 19 for(int i=head[u];i;i=e[i].nxt)
  20. 20 {
  21. 21 int v=e[i].v;
  22. 22 if(!dfn[v])
  23. 23 {
  24. 24 tarjan(v);
  25. 25 low[u]=min(low[u],low[v]);
  26. 26 }
  27. 27 else if(!lt[v])
  28. 28 low[u]=min(low[u],dfn[v]);
  29. 29 }
  30. 30 if(dfn[u]==low[u])
  31. 31 {
  32. 32 lt[u]=++lts;ltn[lts]++;
  33. 33 while(st[top]!=u)lt[st[top--]]=lts,ltn[lts]++;
  34. 34 --top;
  35. 35 }
  36. 36 }
  37. 37 int n,m,x;
  38. 38 int f[maxn],ff[maxn];
  39. 39 int cd[maxn],rd[maxn];
  40. 40 int maxd,maxf;
  41. 41 int pc[maxn];
  42. 42 queue<int>q;
  43. 43 void dfs()
  44. 44 {
  45. 45 while(!q.empty())
  46. 46 {
  47. 47 int u=q.front();q.pop();
  48. 48 maxd=max(maxd,f[u]);
  49. 49 for(int i=headd[u];i;i=ee[i].nxt)
  50. 50 {
  51. 51 int v=ee[i].v;
  52. 52 rd[v]--;
  53. 53 if(rd[v]==0)q.push(v);
  54. 54 if(pc[v]==u)continue;
  55. 55 if(f[u]+ltn[v]>f[v])
  56. 56 {
  57. 57 f[v]=f[u]+ltn[v];
  58. 58 ff[v]=ff[u];
  59. 59
  60. 60 }
  61. 61 else if(f[u]+ltn[v]==f[v])
  62. 62 {
  63. 63 ff[v]=(ff[u]+ff[v])%x;
  64. 64 }
  65. 65 pc[v]=u;
  66. 66 }
  67. 67 }
  68. 68 }
  69. 69 int main()
  70. 70 {
  71. 71 scanf("%d%d%d",&n,&m,&x);
  72. 72 for(int u,v,i=1;i<=m;++i)
  73. 73 {
  74. 74 scanf("%d%d",&u,&v);
  75. 75 addage(e,head,js,u,v);
  76. 76 }
  77. 77 for(int i=1;i<=n;++i)
  78. 78 if(!dfn[i])tarjan(i);
  79. 79 for(int u=1;u<=n;++u)
  80. 80 for(int i=head[u];i;i=e[i].nxt)
  81. 81 if(lt[e[i].u]!=lt[e[i].v])addage(ee,headd,jss,lt[e[i].u],lt[e[i].v]),cd[lt[e[i].u]]++,rd[lt[e[i].v]]++;
  82. 82 for(int i=1;i<=lts;++i)
  83. 83 if(rd[i]==0)q.push(i),f[i]=ltn[i],ff[i]=1;
  84. 84 dfs();
  85. 85 for(int i=1;i<=lts;++i)
  86. 86 {
  87. 87 if(f[i]==maxd)maxf=(maxf+ff[i])%x;
  88. 88 }
  89. 89 printf("%d\n%d\n",maxd,maxf);
  90. 90 return 0;
  91. 91 }

LOJ10092半连通子图的更多相关文章

  1. LOJ-10092(最大半连通子图)

    题目连通:传送门 思路: 题目定义很清晰,然后就不会了QAQ…… 后来看了书,先缩点,然后再用拓扑排序找到最长的链子的节点数(因为缩点后所有点都是一个强连通分量,所以找最长的链子就是最大限度包含 点的 ...

  2. 最大半连通子图 bzoj 1093

    最大半连通子图 (1.5s 128MB) semi [问题描述] 一个有向图G = (V,E)称为半连通的(Semi-Connected),如果满足:∀ u, v ∈V,满足u->v 或 v - ...

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

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

  4. BZOJ1093 最大半连通子图

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

  5. [BZOJ]1093 最大半连通子图(ZJOI2007)

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

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

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

  7. bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划

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

  8. 【刷题】BZOJ 1093 [ZJOI2007]最大半连通子图

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

  9. BZOJ 1093 最大半连通子图 题解

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2767  Solved: 1095[Submit][S ...

随机推荐

  1. flowable 实现多实例-会签-动态配置人员 参考demo

    会签 即多人执行当前任务 设置判断数 通过 例如:设置了是半数通过即可通过当前节点 如果当前是4人那就是2人即通过 如果是6人那就是三人即通过 如果是5人 即三人通过 看各位的判断值是如何书写 这个值 ...

  2. jQuery作业 点击显示

    代码如下: 里: 导入jQuery包: 里:内容 水果 苹果 橘子 梨子 香蕉 化妆品 口红 眼影 腮红 高光 护肤品 水 乳 霜 精华

  3. 所有CSS字体属性

    font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...

  4. Spring-构造注入&注解注入&代理模式&AOP

    1.   课程介绍 1.  依赖注入;(掌握) 2.  XML自动注入;(掌握) 3.  全注解配置;(掌握) 4.  代理模式;(掌握) 5.  AOP;(掌握) 依赖注入;(掌握) 2.1.  构 ...

  5. Turtlebot3新手教程:仿真

    本文章针对如何利用turtlebot3实现仿真功能进行讲解 测试环境:Ubuntu 16.04 和 ROS Kinetic Kame. 注意:TurtleBot3 Simulation 依赖 turt ...

  6. 数据库索引的基石----B树

    数据结构相对来说比较枯燥, 我尽量用最易懂的话,来把B树讲清楚.学过数据结构的人都接触过一个概念二叉树,简单来说,就是每个父节点最多有两个子节点.为了在二叉树上更快的进行元素的查找,人们通过不断的改进 ...

  7. Apache本机不同端口多站点配置:httpd-vhosts.conf(转载)

    环境:Apache2.2.9,Resin-3.1.6,Win Server 2003 1.解压Resin至任意目录,我的是D:; 2. 安装Apache,具体操作下一步.下一步即可,其中要配置的地方是 ...

  8. SQL操作符的优化

    操作符优化        IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQ ...

  9. 杭电1720---A+B Coming(技巧:使用%x)

    Problem Description Many classmates said to me that A+B is must needs. If you can't AC this problem, ...

  10. 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程

    #前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...