BZOJ 1093 最大半连通子图
缩点求最长链。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<queue>
#define maxv 100500
#define maxe 1000500
using namespace std;
struct edge
{
int u,v,nxt;
}e[maxe];
struct pnt
{
int id,rank;
}p[maxv];
int n,m,mod,x,y,g[maxv],nume=,tot=,bel[maxv],times=,dfn[maxv],low[maxv],stack[maxv],top=;
set <int> s[maxv];
set <int> ::iterator it;
int dp1[maxv],dp2[maxv],size[maxv],d[maxv],ans1=,ans2=;
bool ins[maxv];
queue <int> q;
bool cmp(pnt x,pnt y) {return x.rank<y.rank;}
void addedge(int u,int v)
{
e[++nume].u=u;e[nume].v=v;
e[nume].nxt=g[u];g[u]=nume;
}
void tarjan(int x)
{
dfn[x]=low[x]=++times;stack[++top]=x;ins[x]=true;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (!dfn[v])
{
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if (ins[v]) low[x]=min(low[x],dfn[v]);
}
if (dfn[x]==low[x])
{
tot++;int now;
do
{
now=stack[top];size[tot]++;
bel[now]=tot;ins[now]=false;
top--;
}while (now!=x);
}
}
void topusort()
{
for (int i=;i<=tot;i++)
{
p[i].id=i;
if (!d[i]) {q.push(i);p[i].rank=;}
}
while (!q.empty())
{
int head=q.front();q.pop();
for (it=s[head].begin();it!=s[head].end();it++)
{
int v=*it;
if (!--d[v])
{
p[v].rank=p[head].rank+;
q.push(v);
}
}
}
sort(p+,p+tot+,cmp);
}
void dp()
{
for (int i=tot;i>=;i--)
{
int flag=;
int x=p[i].id;
for (it=s[x].begin();it!=s[x].end();it++)
{
flag=;int v=*it;
if (dp1[v]>dp1[x]) {dp1[x]=dp1[v];dp2[x]=dp2[v];}
else if (dp1[v]==dp1[x]) dp2[x]=(dp2[x]+dp2[v])%mod;
}
if (!flag) dp2[x]=;dp1[x]+=size[x];
if (ans1<dp1[x]) {ans1=dp1[x];ans2=dp2[x];}
else if (ans1==dp1[x]) ans2=(ans2+dp2[x])%mod;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
}
for (int i=;i<=n;i++)
if (!dfn[i]) tarjan(i);
for (int i=;i<=nume;i++)
{
int x=e[i].u,y=e[i].v;
if ((s[bel[x]].find(bel[y])==s[bel[x]].end()) && (bel[x]!=bel[y]))
{
s[bel[x]].insert(bel[y]);
d[bel[y]]++;
}
}
topusort();
dp();
printf("%d\n%d\n",ans1,ans2);
return ;
}
BZOJ 1093 最大半连通子图的更多相关文章
- 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 最大半连通子图 题解
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2767 Solved: 1095[Submit][S ...
- [BZOJ]1093 最大半连通子图(ZJOI2007)
挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- 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 ...
- bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2286 Solved: 897[Submit][St ...
- BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
- 最大半连通子图 bzoj 1093
最大半连通子图 (1.5s 128MB) semi [问题描述] 一个有向图G = (V,E)称为半连通的(Semi-Connected),如果满足:∀ u, v ∈V,满足u->v 或 v - ...
- 【刷题】BZOJ 1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
随机推荐
- 企业用户选择Java多于.NET的 5个原因
.NET 和 Java 是当今社会最受欢迎的两种编程语言, 长期的发展和强大的功能使他们足以在编程界立足. 十余年的争论也没得到结果的一个话题就是——他们哪个更好一些? 今天, 我们不再去讨论JAVA ...
- HTML5自学笔记[ 16 ]canvas绘图基础3
canvas还提供提供了一些动态方法,使图像可以旋转.缩放和移动,与css3中的方法一样. 移动:translate(x,y),x和y为横竖方向的偏移量 旋转:rotate(弧度),弧度=角度*Mat ...
- poj-------(2240)Arbitrage(最短路)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15640 Accepted: 6563 Descri ...
- MFC学习之窗口基础
WinMain函数 1.句柄(HANDLE):{ 1. 定义:资源的标识 2. 句柄的作用: 操作系统通过句柄来找到对应的资源,从而对这些资源进行管理和操作. 3句柄的分类:(按资源){ 1.图标句柄 ...
- Java 之 I/O 系列 02 ——序列化(一)
Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 一 序列化概述 序 ...
- spring项目中使用定时任务
当我们希望在某个时间点来执行一些业务方法的时候就用到定时任务,在spring的项目中使用定时任务很简单.如下 第一步.加入jar包 <dependency> <groupId> ...
- FusionCharts ajax 调用方式
方式一:setJSONUrl function initChart() { var myChart = new FusionCharts("Fusion ...
- Windows安装配置php+memcached的方法
Windows下Memcached的安装配置方法 1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcache ...
- Google十大惊人产品
国外资讯网站BusinessInsider刊文细数了谷歌惊世骇俗的十大产品,范围从无人驾驶汽车到太空电梯再到高空风力发电,每一项都令人无限神往,充满未来感. 以下是谷歌十大惊人产品: 众所周知,谷歌并 ...
- zatree第三方插件
Zabbix安装第三方插件zatree2.4.5 1.下载zatree第三方插件https://github.com/spide4k/zatree.git 2.检查PHP环境需要支持php-xml.p ...