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到 ...
随机推荐
- [saiku] 优化多维度查询效率
1.优化查询精度 优化原因:当维度过多时,查询很复杂,效率较慢.因此看能否通过优化sql的方式来提高查询效率. 代码跟踪查看(维度多余3时查询条件里面有in,优化不用in关键字) public abs ...
- 第四周 课堂Scrum站立会议
项目名称:连连看游戏(C#) 小组名称:4Boys 小组成员:武志远.李权.张金生.张政 站立会议内容 昨天完成的: 1.完成了游戏界面 2.做查阅关于技术方面的资料并且发布博客 3.发布项目的进度p ...
- Roman to Integer [LeetCode]
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
- memcached 学习 1—— memcached+spring配置
memcached 学习目录: memcached 学习 1—— memcached+spring配置 这几天自己搭建项目环境,解决问题如下: 有关常见的配置这里没有列出,中间遇到的搭建问题比较顺利g ...
- Objective-C:@class和#import
@class和#import是OC中引用一个类的两种方式,其区别在于: #import相当于把被引用文件的内容拷贝到目标文件,这会包含被引用类的所有信息,包括被引用类的变量和方法(会降低编译性能 ): ...
- BZOJ1584 [Usaco2009 Mar]Cleaning Up 打扫卫生
令$f[i]$表示以i为结尾的答案最小值,则$f[i] = min \{f[j] + cnt[j + 1][i]^2\}_{1 \leq j < i}$,其中$cnt[j + 1][i]$表示$ ...
- git 将本地项目添加到远程
git init git add README.md git commit -m "first commit" git remote add origin git@github.c ...
- Ubuntu 13.10 Broadcom BCM4313问题
开始找不到无线网卡,后来不知道怎么就出来了,但是速度很慢.用下面的方法解决的(我也不知道哪条命令起的作用,反正现在正常了): sudo apt-get remove --purge bcmwl-ker ...
- bzoj 2286: [Sdoi2011消耗战
#include<cstdio> #include<iostream> #define M 1000009 #define N 250009 #define ll long l ...
- NDK JNI 的关键点
1.System.loadLibrary 的名字是在Android.mk里面设定的 LOCAL_MODULE := httpdown,MODULE 后面跟的就是了 2.如何正确调用到关键 ...