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 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10,maxm=1e6+10;
4 struct edge
5 {
6 int u,v,nxt;
7 }e[maxm],ee[maxm];
8 int head[maxn],js,headd[maxn],jss;
9 void addage(edge e[],int head[],int &js,int u,int v)
10 {
11 e[++js].u=u;e[js].v=v;
12 e[js].nxt=head[u];head[u]=js;
13 }
14 int dfn[maxn],low[maxn],cnt,st[maxn],top,lt[maxn],lts,ltn[maxn];
15 void tarjan(int u)
16 {
17 dfn[u]=low[u]=++cnt;
18 st[++top]=u;
19 for(int i=head[u];i;i=e[i].nxt)
20 {
21 int v=e[i].v;
22 if(!dfn[v])
23 {
24 tarjan(v);
25 low[u]=min(low[u],low[v]);
26 }
27 else if(!lt[v])
28 low[u]=min(low[u],dfn[v]);
29 }
30 if(dfn[u]==low[u])
31 {
32 lt[u]=++lts;ltn[lts]++;
33 while(st[top]!=u)lt[st[top--]]=lts,ltn[lts]++;
34 --top;
35 }
36 }
37 int n,m,x;
38 int f[maxn],ff[maxn];
39 int cd[maxn],rd[maxn];
40 int maxd,maxf;
41 int pc[maxn];
42 queue<int>q;
43 void dfs()
44 {
45 while(!q.empty())
46 {
47 int u=q.front();q.pop();
48 maxd=max(maxd,f[u]);
49 for(int i=headd[u];i;i=ee[i].nxt)
50 {
51 int v=ee[i].v;
52 rd[v]--;
53 if(rd[v]==0)q.push(v);
54 if(pc[v]==u)continue;
55 if(f[u]+ltn[v]>f[v])
56 {
57 f[v]=f[u]+ltn[v];
58 ff[v]=ff[u];
59
60 }
61 else if(f[u]+ltn[v]==f[v])
62 {
63 ff[v]=(ff[u]+ff[v])%x;
64 }
65 pc[v]=u;
66 }
67 }
68 }
69 int main()
70 {
71 scanf("%d%d%d",&n,&m,&x);
72 for(int u,v,i=1;i<=m;++i)
73 {
74 scanf("%d%d",&u,&v);
75 addage(e,head,js,u,v);
76 }
77 for(int i=1;i<=n;++i)
78 if(!dfn[i])tarjan(i);
79 for(int u=1;u<=n;++u)
80 for(int i=head[u];i;i=e[i].nxt)
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 for(int i=1;i<=lts;++i)
83 if(rd[i]==0)q.push(i),f[i]=ltn[i],ff[i]=1;
84 dfs();
85 for(int i=1;i<=lts;++i)
86 {
87 if(f[i]==maxd)maxf=(maxf+ff[i])%x;
88 }
89 printf("%d\n%d\n",maxd,maxf);
90 return 0;
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. Shell 编程(一)

    为什么学习 Shell 编程? 用 shell 来进行服务器的管理或维护 对于大数据程序员来说,需要编写 shell 来管理集群 Shell 是什么?   Shell 是一个命令解释器,它为用户提供了 ...

  2. Phoneix(三)HBase集成Phoenix创建二级索引

    一.Hbase集成Phoneix 1.下载 在官网http://www.apache.org/dyn/closer.lua/phoenix/中选择提供的镜像站点中下载与安装的HBase版本对应的版本. ...

  3. 腾讯消息队列CMQ部署与验证

    环境 IP 备注 192.168.1.66 node1 前置机 192.168.1.110 node2 192.168.1.202 node3 架构图 组件介绍 组件 监听端口 access 1200 ...

  4. ATM_tests

    ATM取款机练习程序 一.程序分析 自顶向下.逐步细化 按照程序执行的流程,将程序分解为若干个功能相对独立的函数(方法),每个函数(方法)负责某一功能,然后根据程序执行的流程,将函数(方法)组装(调用 ...

  5. Linux下Oracle 11G XE 安装笔记

    操作系统 [oracle@RAC02 ~]$ lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:cor ...

  6. java调用js代码

    jdk8里使用脚本引擎调用js 1.定义一个js方法: function getRouteInfo(province){ //注意,参数不要带var..在java里执行会报错.. if (provin ...

  7. idea中文注释出现乱码,我靠自己解决了

    如果你像我一样️,查遍google百度,半天下来还是找不到解决方案,说不定这篇博客能帮助你顺利解决呢 好了,那么开始说说我是怎么解决麻烦的. 首先,我想打开一份java文稿.光预览,它是没有任何问题的 ...

  8. Linux学习笔记 | 配置Samba

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通 ...

  9. 容器编排系统K8s之Prometheus监控系统+Grafana部署

    前文我们聊到了k8s的apiservice资源结合自定义apiserver扩展原生apiserver功能的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/ ...

  10. 安装Tomcat 9

    文章目录 访问Tomcat官网 选择下载所需的软件包 安装Tomcat 测试安装 访问Tomcat官网 Tomcat官方的下载地址为:https://tomcat.apache.org/downloa ...