BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图
Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 1986  Solved: 802
[Submit][Status][Discuss]
Description

Input
第一行包含两个整数N,M,X。N,M分别表示图G的点数与边数,X的意义如上文所述。接下来M行,每行两个正整数a, b,表示一条有向边(a, b)。图中的每个点将编号为1,2,3…N,保证输入中同一个(a,b)不会出现两次。
Output
应包含两行,第一行包含一个整数K。第二行包含整数C Mod X.
Sample Input
1 2
2 1
1 3
2 4
5 6
6 4
Sample Output
3
HINT
对于100%的数据, N ≤100000, M ≤1000000;对于100%的数据, X ≤10^8。
Source
题解:缩点dp。注意处理好大点间的重边。
你问我写哪种dp?首推topo啊!记忆化什么的常数大的。。。(雾
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define MSE(a,b) memset(a,b,sizeof(a))
#define REN(x) for(ted*e=fch[x];e;e=e->nxt)
#define REN2(x) for(ted*e=fch2[x];e;e=e->nxt)
#define TIL(x) for(int i=1;i<=x;i++)
#define ALL(x) for(int j=1;j<=x;j++)
using namespace std;
const int maxn=+,maxm=+,inf=1e9;
struct ted{int x,y;ted*nxt;}adj[maxm],adj2[maxm],*fch[maxn],*fch2[maxn],*ms=adj,*ms2=adj2;
void add(int x,int y){*ms=(ted){x,y,fch[x]};fch[x]=ms++;return;}int in[maxn];
void add2(int x,int y){*ms2=(ted){x,y,fch2[x]};fch2[x]=ms2++;in[y]++;return;}
int dfn[maxn],low[maxn],beg[maxn],siz[maxn],scc,cz,f[maxn],g[maxn],vis[maxn],mod;bool ins[maxn];stack<int>S;
void tarjan(int x){
dfn[x]=low[x]=++cz;ins[x]=true;S.push(x);REN(x){int v=e->y;
if(!dfn[v])tarjan(v),low[x]=min(low[x],low[v]);else if(ins[v])low[x]=min(low[x],dfn[v]);
}if(low[x]==dfn[x]){scc++;int t;
do beg[t=S.top()]=scc,ins[t]=false,S.pop(),siz[scc]++;while(t!=x);
}return;
}
int n,m;
void rebuild(){
TIL(n)REN(i)if(beg[i]!=beg[e->y])add2(beg[i],beg[e->y]);return;
}
void topodp(){
queue<int>Q;TIL(scc)if(!in[i])Q.push(i);TIL(scc)f[i]=siz[i],g[i]=;
while(!Q.empty()){
int x=Q.front();Q.pop();REN2(x){int v=e->y;
if(--in[v]==)Q.push(v);
if(vis[v]!=x){vis[v]=x;
if(f[x]+siz[v]>f[v])f[v]=f[x]+siz[v],g[v]=g[x];
else if(f[x]+siz[v]==f[v])(g[v]+=g[x])%=mod;
}
}
}return;
}
inline int read(){
int x=;bool sig=true;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=false;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';return sig?x:-x;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=;static int buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int main(){
n=read();m=read();mod=read();int x,y;
TIL(m)x=read(),y=read(),add(x,y);
TIL(n)if(!dfn[i])tarjan(i);rebuild();topodp();
int mx=-inf,ans;
TIL(scc){
if(mx<f[i])mx=f[i],ans=g[i];
else if(f[i]==mx)(ans+=g[i])%=mod;
}write(mx);ENT;write(ans);
return ;
}
BZOJ 1093 [ZJOI2007]最大半连通子图的更多相关文章
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
		
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
 - 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 [ZJOI2007]最大半连通子图
		
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
 - BZOJ 1093 [ZJOI2007]最大半连通子图 - Tarjan 缩点
		
Description 定义一个半联通图为 : 对任意的两个点$u, v$,都有存在一条路径从$u$到$v$, 或从$v$到$u$. 给出一个有向图, 要求出节点最多的半联通子图, 并求出方案数. ...
 - bzoj 1093 [ZJOI2007]最大半连通子图——缩点+拓扑
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 缩点+拓扑,更新长度的时候维护方案数. 结果没想到处理缩点后的重边,这样的话方案数会算 ...
 - bzoj 1093: [ZJOI2007]最大半连通子图【tarjan+拓扑排序+dp】
		
先tarjan缩成DAG,然后答案就变成了最长链,dp的同时计数即可 就是题面太唬人了,没反应过来 #include<iostream> #include<cstdio> #i ...
 - [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)
		
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...
 - 【BZOJ】1093: [ZJOI2007]最大半连通子图(tarjan+拓扑序)
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1093 两个条件综合起来加上求最大的节点数,那么很明显如果是环一定要缩点. 然后再仔细思考下就是求da ...
 
随机推荐
- ios中图片的绘画和截图
			
ios中图片的绘画和截图 CGImageCreateWithImageInRect截图和UIGraphicsGetImageFromCurrentImageContext绘画图片 使用CGImageC ...
 - mysqldump备份数据库时出现when using LOCK TABLES
			
用mysqldump备份数据库时,如果出现when using LOCK TABLES,解决办法是加上 --skip-lock-tables 例如: 用mysqldump备份数据库时出现 29: Fi ...
 - auth tips
			
https://scotch.io/tutorials/easy-node-authentication-setup-and-local https://scotch.io/tutorials/upg ...
 - asp.net下载文件的几种方法
			
最近做东西遇到了下载相关的问题.在这里总结一下自己处理的方法. 1.以字节流的形式向页面输出数据以下载Excel为例子. string path=Server.MapPath("文件路径&q ...
 - String的hashCode原理
			
参考下面这篇文章: http://blog.csdn.net/steveguoshao/article/details/12576849 http://blog.csdn.net/mingli1986 ...
 - 解决win service 2003 IIS发布Gis网站后,访问地图服务出错,无法正常打开而且 事件查看器出现错误提示。
			
错误详情: 应用程序-特定 权限设置未将 COM 服务器应用程序(CLSID 为{379376DB-AEA6-40D1-9491-9345E61EF6BE})的 本地 激活 权限授予用户 NT AUT ...
 - [原创] Fragment的添加、移除问题
			
安卓一直在进化,Fragment就是个好东西,如果早5年做安卓开发,真要麻烦的多. 关于Fragment的讲解,这里很详尽: Android Fragment 真正的完全解析(上) Android F ...
 - jquery ui 插件------------------------->sortable
			
<!doctype html><html lang="en"><head> <meta charset="utf-8" ...
 - 十五、C# 使用查询表达式的LINQ
			
使用查询表达式的LINQ 本章介绍了一种新的语法,查询表达式. 1.查询表达式概述 2.特点:投射 筛选 排序 Let 分组 3.作为方法调用 标准查询运算符所实现的查询在功能上 ...
 - SGU 121.Bridges painting
			
原题地址 题意: 新百慕大由N个岛屿组成,在岛屿之间有一些连接它们的桥.在任意两个岛屿之间,最多只有一座桥连接它们.总统先生下达命令,要求给所有桥上色. 每一座桥能被染成 白色 或者 黑色. 每一个岛 ...