LOJ10092半连通子图
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
1 2
2 1
1 3
2 4
5 6
6 4
Sample Output
3
- 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半连通子图的更多相关文章
- LOJ-10092(最大半连通子图)
题目连通:传送门 思路: 题目定义很清晰,然后就不会了QAQ…… 后来看了书,先缩点,然后再用拓扑排序找到最长的链子的节点数(因为缩点后所有点都是一个强连通分量,所以找最长的链子就是最大限度包含 点的 ...
- 最大半连通子图 bzoj 1093
最大半连通子图 (1.5s 128MB) semi [问题描述] 一个有向图G = (V,E)称为半连通的(Semi-Connected),如果满足:∀ u, v ∈V,满足u->v 或 v - ...
- BZOJ1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- BZOJ1093 最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
- [BZOJ]1093 最大半连通子图(ZJOI2007)
挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)
发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...
- bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- 【刷题】BZOJ 1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
- BZOJ 1093 最大半连通子图 题解
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2767 Solved: 1095[Submit][S ...
随机推荐
- flowable 实现多实例-会签-动态配置人员 参考demo
会签 即多人执行当前任务 设置判断数 通过 例如:设置了是半数通过即可通过当前节点 如果当前是4人那就是2人即通过 如果是6人那就是三人即通过 如果是5人 即三人通过 看各位的判断值是如何书写 这个值 ...
- jQuery作业 点击显示
代码如下: 里: 导入jQuery包: 里:内容 水果 苹果 橘子 梨子 香蕉 化妆品 口红 眼影 腮红 高光 护肤品 水 乳 霜 精华
- 所有CSS字体属性
font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...
- Spring-构造注入&注解注入&代理模式&AOP
1. 课程介绍 1. 依赖注入;(掌握) 2. XML自动注入;(掌握) 3. 全注解配置;(掌握) 4. 代理模式;(掌握) 5. AOP;(掌握) 依赖注入;(掌握) 2.1. 构 ...
- Turtlebot3新手教程:仿真
本文章针对如何利用turtlebot3实现仿真功能进行讲解 测试环境:Ubuntu 16.04 和 ROS Kinetic Kame. 注意:TurtleBot3 Simulation 依赖 turt ...
- 数据库索引的基石----B树
数据结构相对来说比较枯燥, 我尽量用最易懂的话,来把B树讲清楚.学过数据结构的人都接触过一个概念二叉树,简单来说,就是每个父节点最多有两个子节点.为了在二叉树上更快的进行元素的查找,人们通过不断的改进 ...
- Apache本机不同端口多站点配置:httpd-vhosts.conf(转载)
环境:Apache2.2.9,Resin-3.1.6,Win Server 2003 1.解压Resin至任意目录,我的是D:; 2. 安装Apache,具体操作下一步.下一步即可,其中要配置的地方是 ...
- SQL操作符的优化
操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQ ...
- 杭电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, ...
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...