缩点求最长链。

#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 最大半连通子图的更多相关文章

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

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

  2. BZOJ 1093 最大半连通子图 题解

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2767  Solved: 1095[Submit][S ...

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

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

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

    题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 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

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

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

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

随机推荐

  1. hdu---1506(Largest Rectangle in a Histogram/dp最大子矩阵)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. Symmetric Tree [LeetCode]

    Problem description: http://oj.leetcode.com/problems/symmetric-tree/ Basic idea: Both recursive and ...

  3. collectionView初始化

    collectionView初始化时一定要加layout.不然会报错: UICollectionView must be initialized with a non-nil layout param ...

  4. 后Hadoop时代的大数据架构(转)

    原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞       提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年 ...

  5. 30 个很棒的 PHP 开源 CMS 内容管理系统

    本文汇集了30个优秀的开源CMS建站系统,采用PHP开发.以下列表不分先后顺序. 1. AdaptCMS AdaptCMS Lite 是一个开源的CMS系统,主要特点是易用,而且可以轻松和其他系统接驳 ...

  6. C++文件读写练习

    编写一个程序,统计data.txt文件的行数,并将所有行前加上行号后写到data1.txt文件中. 算法提示: 行与行之间以回车符分隔,而getline()函数以回车符作为终止符.因此,可以采用get ...

  7. matalab(绘图)

    plot(x) % 绘图语句F = getframe(gcf); %抓取图片imwrite(F.cdata,'myfile.jpg'); %保存图片 然后就可以在默认路径也就是matlab工作目录中找 ...

  8. async 和await

    这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...

  9. Could not find artifact com.sun:tools:jar:1.5.0

    问题: Failed to execute goal on project petroleum: Could not resolve dependencies for project petroleu ...

  10. webApi跨域

    <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...