BZOJ1093 [ZJOI2007]最大半连通子图
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
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct X
{
int v,n,f;
}x[],y[];
const int N=1e5+;
int s,st[N],top,dfn[N],low[N],pa[N],cnt,t,w=-,q[N],syg[N];
bool vis[N],sf[N];
void add(int u,int v)
{
y[++s].n=y[u].f;
y[y[u].f=s].v=v;
}
void dfs(int u)
{
dfn[u]=low[u]=++s;
vis[st[++top]=u]=sf[u]=;
for(int i=x[u].f;i;i=x[i].n)
if(!vis[x[i].v]) dfs(x[i].v),low[u]=min(low[x[i].v],low[u]);
else if(sf[x[i].v]) low[u]=min(low[u],dfn[x[i].v]);
if(dfn[u]==low[u])
{
pa[u]=++cnt;
for(;st[top]!=u;top--)
pa[st[top]]=cnt,sf[st[top]]=;
top--;sf[u]=;
}
}
int main()
{
int n,m,mod;
scanf("%d%d%d",&n,&m,&mod);
for(int i=;i<=m;i++)
{
int u;
scanf("%d%d",&u,&x[i].v);
x[i].n=x[u].f;
x[u].f=i;
}
for(int i=;i<=n;i++)
if(!vis[i]) dfs(i);
memset(st,,sizeof(st));
memset(dfn,,sizeof(dfn));
memset(vis,,sizeof(vis));
s=;
for(int i=;i<=n;i++)
{
st[pa[i]]++;
for(int j=x[i].f;j;j=x[j].n)
if(pa[i]!=pa[x[j].v]) add(pa[i],pa[x[j].v]),++dfn[pa[x[j].v]];
}
memset(pa,,sizeof(pa));
memset(low,,sizeof(low));
for(int i=;i<=cnt;i++)
if(!dfn[i]) vis[q[++w]=i]=,low[i]=,pa[i]=st[i];
for(;t<=w;t++)
{
for(int i=y[q[t]].f;i;i=y[i].n)
if(!vis[y[i].v])
{
dfn[y[i].v]--;
if(!dfn[y[i].v]) vis[q[++w]=y[i].v]=;
if(syg[y[i].v]==q[t]) continue;
syg[y[i].v]=q[t];
if(st[y[i].v]+pa[q[t]]>pa[y[i].v])
{
pa[y[i].v]=pa[q[t]]+st[y[i].v];
low[y[i].v]=low[q[t]];
}
else if(st[y[i].v]+pa[q[t]]==pa[y[i].v]) low[y[i].v]+=low[q[t]],low[y[i].v]%=mod;
}
}
int ans1=,ans2;
for(int i=;i<=cnt;i++)
if(ans1<pa[i]) ans1=pa[i],ans2=low[i];
else if(ans1==pa[i]) ans2+=low[i],ans2%=mod;
printf("%d\n%d",ans1,ans2);
return ;
}
BZOJ1093 [ZJOI2007]最大半连通子图的更多相关文章
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- 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 ...
- BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】
题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...
- BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
- BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)
发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...
- 2018.11.06 bzoj1093: [ZJOI2007]最大半连通子图(缩点+拓扑排序)
传送门 先将原图缩点,缩掉之后的点权就是连通块大小. 然后用拓扑排序统计最长链数就行了. 自己yyyyyy了一下一个好一点的统计方法. 把所有缩了之后的点都连向一个虚点. 然后再跑拓扑,这样最后虚点的 ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
- BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
随机推荐
- C#通过属性名称获取(读取)属性值的方法 z
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Prop ...
- 合并两个java bean对象非空属性(泛型)
import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; cl ...
- selenium + phantomjs 爬取落网音乐
题记: 作为一个业余程序猿,最大的爱好就是电影和音乐了,听音乐当然要来点有档次的.落网的音乐的逼格有点高,一听听了10年.学习python一久了,于是想用python技术把落网的音乐爬下来随便听. 目 ...
- 【原】redis插件安装
wget -c https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz -O phpredis-2.2.4.tar.gz tar xzf ...
- js 循环
//数组循环var a = [1, 2, 3, 4, 5, 6];for (var i = 0, l = a.length; i < l; i++) { console.log(a[i]);} ...
- Manually enable Appear Offline in Lync 2013 Preview via Registry
refer to http://www.shudnow.net/2012/09/18/manually-enable-appear-offline-in-lync-2013-preview-via-r ...
- 记录Castle ActiveRecord访问Sqlite的配置
1.ActiveRecord配置文件ARConfig.xml,并将配置文件的“生成操作”改成“嵌入的资源” <?xml version=; i < ; i++) { ...
- sp,文件以及SDcard存储
XML: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi ...
- sublime安装插件步骤
sublime text 3 安装package contol: 快捷键:ctrl+`进入命令行输入 import urllib.request,os;pf='Package Control.sub ...
- 二模15day1解题报告
T1.合并序列(minval) 给出长为 n的AB两个序列求两两相加中最小的n个. 据说有证明(在蓝书上,优先队列部分)先把A[1~n]+b[1]入队,然后每取一个a[x]+b[y]就把a[x]+b[ ...