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到 ...
随机推荐
- js对字符串函数之charAt()
var str="012345"; 字符串下标的index从0开始: charAt(index)返回指定位置的字符如果index不在0-str.length之间,返回一个空字符串: ...
- Windows NT访问权限
#define SECTION_QUERY 0x0001 #define SECTION_MAP_WRITE 0x0002 #define SECTION_MAP_READ 0x0004 #defin ...
- 30 个很棒的 PHP 开源 CMS 内容管理系统
本文汇集了30个优秀的开源CMS建站系统,采用PHP开发.以下列表不分先后顺序. 1. AdaptCMS AdaptCMS Lite 是一个开源的CMS系统,主要特点是易用,而且可以轻松和其他系统接驳 ...
- css清除浮动的处理方法
根据<精彩绝伦的css> <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- ZooKeeper(3.4.5) 使用Curator监听事件
转载:http://www.mamicode.com/info-detail-494364.html 标签: ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher ...
- idea tomcat +eclipse式的部署
使用习惯了eclipse, 还没开始使用maven, 使用idea 有些不太习惯,现在记录下来,以备忘. /*这一步在tomcat使用external source时,其实是不起作用的**/ a. ...
- node.js+WebStorm路径问题
目录路径 :A文件夹下有B.C文件夹和app.js文件.B文件夹下有webserver.js文件等. A B webserver.js ...... C ...... app.js WebStorm配 ...
- java面向对象编程——第二章 java基础语法
第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...
- [Js]焦点图轮播效果
一.所用到的知识点 1.DOM操作 2.定时器 3.事件运用 4.Js动画 5.函数递归 6.无限滚动大法 二.结构和样式 <div id="banner" class=&q ...
- [转] jQuery源码分析-如何做jQuery源码分析
jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...