bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)
1093: [ZJOI2007]最大半连通子图
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 2286 Solved: 897
[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
求scc,锁点。则问题转化为求DAG上的最长路,在拓扑序上进行DP即可。
需要注意的是重新构图的时候会有重边,为了防止重复计数需要特别处理一下。
【代码】
#include<cstdio>
#include<stack>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std; const int maxn = +; vector<int> g[maxn],G[maxn];
int pre[maxn],lowlink[maxn],sccno[maxn],scccnt,dfsclock;
stack<int> S; int dfs(int u) {
pre[u]=lowlink[u]=++dfsclock;
S.push(u);
for(int i=;i<g[u].size();i++) {
int v=g[u][i];
if(!pre[v]) {
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!sccno[v]) {
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]) {
++scccnt;
for(;;) {
int x=S.top() ; S.pop();
sccno[x]=scccnt;
if(x==u) break;
}
}
}
void findscc(int n) {
memset(pre,,sizeof(pre));
memset(sccno,,sizeof(sccno));
dfsclock=scccnt=;
for(int i=;i<n;i++)
if(!pre[i]) dfs(i);
} int n,m,MOD;
int d[maxn],cnt[maxn]; int val[maxn],in[maxn];
void build() {
for(int i=;i<n;i++) {
val[sccno[i]]++;
for(int j=;j<g[i].size();j++) {
int v=g[i][j];
if(sccno[i]==sccno[v]) continue;
in[sccno[v]]++;
G[sccno[i]].push_back(sccno[v]);
}
}
}
void solve() {
queue<int> q;
int vis[maxn];
for(int i=;i<=scccnt;i++) if(!in[i]) {
d[i]=val[i] , cnt[i]=;
q.push(i);
}
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=;i<G[u].size();i++) {
int v=G[u][i];
if(!(--in[v])) q.push(v);
if(vis[v]!=u) { //重新构图后有重边 防止重复计数
if(d[v]<d[u]+val[v]) {
d[v]=d[u]+val[v]; cnt[v]=cnt[u];
}
else if(d[v]==d[u]+val[v])
cnt[v]=(cnt[v]+cnt[u])%MOD;
}
vis[v]=u;
}
}
} int main() {
scanf("%d%d%d",&n,&m,&MOD);
int u,v;
while(m--) {
scanf("%d%d",&u,&v);
u-- , v--;
g[u].push_back(v);
}
findscc(n);
build();
solve();
int ans=,ansnum=;
for(int i=;i<=scccnt;i++)
if(ans<d[i]) ans=d[i] , ansnum=cnt[i];
else if(ans==d[i]) ansnum=(ansnum+cnt[i])%MOD;
printf("%d\n%d",ans,ansnum);
return ;
}
bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)的更多相关文章
- BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
- 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]最大半连通子图
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 ...
- Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)
P2272 [ZJOI2007]最大半连通子图 题意 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v\in V\) ...
- bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
随机推荐
- selenium+eclipse+python环境
1.下载并安装jdk,配置环境变量: 2.下载并安装python,配置path系统环境变量:D:\Program Files\python34: 3.安装selenium,在安装好的python路径D ...
- C#中的Dictionary简介
简介在C#中,Dictionary提供快速的基于兼职的元素查找.当你有很多元素的时候可以使用它.它包含在System.Collections.Generic名空间中. 在使用前,你必须声明它的键类型和 ...
- Visual C#实现Windows信使服务
现在有很多网络管理软件都具备网络上信息实时传送的功能,虽然有些网络通讯软件功能比较强大,有的软件不仅可以传送文本信息,还可以传送二进制文件等.但 它们都有一个无法克服的缺点,那就是分发比较困难,信息传 ...
- reflact中GetMethod方法的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- Redis Admin UI
https://github.com/ServiceStackApps/RedisAdminUI 最近的v4版本不能用,需要下载v3版本,下载地址 https://github.com/Service ...
- OC - 26.CAAnimationGroup
概述 简介 CAAnimationGroup又称组动画或动画组 将多个动画放到动画组中,并赋值给layer的animations属性,动画组中所有动画就会并发执行 注意事项 动画组中的动画不会被压缩, ...
- tableView尾部多处一部分空白高度
问题出现的原因:创建tableView时使用的style是UITableViewStylePlain 解决办法: 在创建tableView时,self.automaticallyAdjustsScro ...
- (java)从零开始之--观察者设计模式Observer
观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对 ...
- 计算机网络基础_01IP地址
1,IP地址组成和分级分级 IP地址=网络地址+主机地址 32位,4段组成 A:最高位是0 ,1个字节的网络地址,3个字节的主机地址 B:最高位是10,2个字节的网络地址,2个字节的主机地址 C:最高 ...
- 给表格设置border还可以这样玩
<table width="100%" border="0" cellpadding="0" cellspacing="1& ...