题目连通:传送门

思路:

题目定义很清晰,然后就不会了QAQ……

后来看了书,先缩点,然后再用拓扑排序找到最长的链子的节点数(因为缩点后所有点都是一个强连通分量,所以找最长的链子就是最大限度包含

点的半连通子图)然后用dp求出由多少个长度相同的链子(e数组记录从开始到i节点所有的方案数,dis数组表示链子的节点个数,每次找到更长的链子时就更新数组,然后最后求出多少个满足最长链子的方案)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e6+;
int head[maxn],next[maxn],ver[maxn],tot;
int num[maxn],low[maxn],tim,co[maxn],si[maxn],col;
int st[maxn],que[maxn],top,t,w;
int du[maxn],e[maxn],ans,anss,m,n,MOD;
int x[maxn],y[maxn],nu[maxn],dis[maxn];
int MIN(int a,int b)
{
return a<b?a:b;
}
void addedge(int u,int v)
{
ver[++tot]=v;next[tot]=head[u];head[u]=tot;
}
void Tarjan(int u)
{
low[u]=num[u]=++tim;
st[++top]=u;
for(int i=head[u];i;i=next[i]){
int v=ver[i];
if(!num[v]){
Tarjan(v);
low[u]=MIN(low[u],low[v]);
}
else if(!co[v]) low[u]=MIN(low[u],num[v]);
}
if(num[u]==low[u]){
col++;
si[col]++;
co[u]=col;
while(u!=st[top]){
si[col]++;
co[st[top]]=col;
top--;
}
top--;
}
}
bool cmp(int a,int b)
{
if(x[a]!=x[b]) return x[a]<x[b];
else return y[a]<y[b];
}
void Remove()
{
for(int i=;i<=m;i++){
nu[i]=i;
x[i]=co[x[i]];
y[i]=co[y[i]];
}
sort(nu+,nu++m,cmp);
}
void Build()
{
tot=;
memset(head,,sizeof(head));
for(int i=;i<=m;i++){
int z=nu[i];
if((x[z]!=y[z])&&(x[z]!=x[nu[i-]]||y[z]!=y[nu[i-]]))
addedge(x[z],y[z]),du[y[z]]++;
}
}
void Reset()
{
for(int i=;i<=col;i++)
if(!du[i]){
que[++w]=i;
dis[i]=si[i];
e[i]=;
if(dis[i]>dis[ans]) ans=i;
}
}
void Topo()
{
while(t<w){
int u=que[++t];
for(int i=head[u];i;i=next[i]){
int v=ver[i];
--du[v];
if(dis[v]<dis[u]+si[v]){
dis[v]=dis[u]+si[v];
e[v]=;
if(dis[ans]<dis[v]) ans=v;
}
if(dis[v]==dis[u]+si[v]) e[v]=(e[v]+e[u])%MOD;
if(!du[v]) que[++w]=v;
}
}
}
void ANS()
{
for(int i=;i<=n;i++)
if(dis[i]==dis[ans]) anss=(anss+e[i])%MOD;
}
int main(void)
{
int i,j;
scanf("%d%d%d",&n,&m,&MOD);
for(i=;i<=m;i++){
scanf("%d%d",&x[i],&y[i]);
addedge(x[i],y[i]);
}
for(i=;i<=n;i++)
if(!num[i]) Tarjan(i); Remove();
Build();
Reset();
Topo();
ANS();
printf("%d\n%d",dis[ans],anss);
return ;
}

LOJ-10092(最大半连通子图)的更多相关文章

  1. 最大半连通子图 bzoj 1093

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

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

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

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

    题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...

  4. BZOJ1093 最大半连通子图

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

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

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1986  Solved: 802[Submit][St ...

  6. bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 897[Submit][St ...

  7. BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )

    WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...

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

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

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

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

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

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

随机推荐

  1. jquery中的 deferred之 then (二)

    例: var def = $.Deferred(); var prs1 = def.then(function (val) { var result = val + "_123" ...

  2. 【第二组】Hunter-alpha版本发布报告

    Alpha版本测试报告 一  BUG汇总 1.暂时无法进行注册.(打算修复) 2.用户发布任务界面图标按钮存在显示bug.(打算修复) 3.主界面下拉菜单暂无内容,无法弹出.(打算修复) 二  场景测 ...

  3. centos7.4重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  4. 记一次yii2 上传文件

    1 view渲染 <form action="../src/website/import/report-flow" method="post" encty ...

  5. Java学习笔记(二十四):单例设计模式singleton

    为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...

  6. 【转】JRXlsExporter.setParameter常用参数说明

    net.sf.jasperreports.engine.JRExporterParameter. JASPER_PRINT 这个参数是net.sf.jasperreports.engine.Jaspe ...

  7. HTTP协议转码

    为什么要有转义的功能? 一些特殊字符需要转义,才能被访问,否则变为空格 UrlEnCode与UrlDeCode 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的 ...

  8. JavaSE基础知识(7)—常用类

    一.包装类 1.理解 java为八大基本数据类型一一对应提供了引用类型,方便使用里面的属性和方法 2.包装类型 byte——>Byteshort——>Shortint——>Integ ...

  9. Linux 学习笔记 2:文件系统

    1.文件系统层次结构 系统目录内容: /: 根目录(之后的/都是目录分隔符) /home:用户目录 /bin: Unix常用命令,如bash, date, cat, tar等 /sbin: 管理员命令 ...

  10. 7F - 无限的路

    甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形: 甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中 ...