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

6 6 20070603
1 2
2 1
1 3
2 4
5 6
6 4

Sample Output

3
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)的更多相关文章

  1. BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )

    WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...

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

    题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...

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

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1986  Solved: 802[Submit][St ...

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

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

  5. BZOJ 1093 [ZJOI2007]最大半连通子图 - Tarjan 缩点

    Description 定义一个半联通图为 : 对任意的两个点$u, v$,都有存在一条路径从$u$到$v$, 或从$v$到$u$. 给出一个有向图, 要求出节点最多的半联通子图,  并求出方案数. ...

  6. bzoj 1093 [ZJOI2007]最大半连通子图——缩点+拓扑

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1093 缩点+拓扑,更新长度的时候维护方案数. 结果没想到处理缩点后的重边,这样的话方案数会算 ...

  7. bzoj 1093: [ZJOI2007]最大半连通子图【tarjan+拓扑排序+dp】

    先tarjan缩成DAG,然后答案就变成了最长链,dp的同时计数即可 就是题面太唬人了,没反应过来 #include<iostream> #include<cstdio> #i ...

  8. Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)

    P2272 [ZJOI2007]最大半连通子图 题意 题目描述 一个有向图\(G=(V,E)\)称为半连通的\((Semi-Connected)\),如果满足:\(\forall u,v\in V\) ...

  9. 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 ...

随机推荐

  1. 在java中使用 File.renameTo(File)实现重命名.

    Here is part of my files: [北京圣思园Java培训教学视频]Java.SE.前9日学习成果测试题(2010年12月2日).rar [北京圣思园Java培训教学视频]Java. ...

  2. C#中区别多态、重载、重写的概念和语法结构

    C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...

  3. ios 动画效果CATransition笔记

    初学ios开发,很多概念还不清楚,所以只有边学边做例子.又怕学了后面忘了前面,因此用自己的博客来纪录自己的学习历程,也是对自己学习不要懈怠做个监督. 刚学ios做动画效果.因为ios封装得很好,实现i ...

  4. IE6解决固定定位代码

    有些朋友在进行网页布局时,会遇到IE6浏览器不支持固定定位的兼容性问题,本博将详细介绍此问题的解决方法,需要了解的朋友可以参考下. ie6 垂直居中固定定位,代码如下: #center {_posit ...

  5. (java)从零开始之-反射Reflect

    反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用 ...

  6. 【HDU4391】【块状链表】Paint The Wall

    Problem Description As a amateur artist, Xenocide loves painting the wall. The wall can be considere ...

  7. javascript——处理(获取)浏览器版本、操作系统

    javascript——处理(获取)浏览器版本.操作系统 /** * Created by Administrator on 15-1-12. */ function BroswerUtil() { ...

  8. yzoi2223集合构造的详细解法

    Description - 问题描述 集合M的定义如下: 1是M中的元素 如果x是M中的元素,那么2x+1和4x+5都是M中的元素 那么,集合M中,最小的n个数是哪些? Input - 输入数据 一个 ...

  9. 在CMD下用java命令出现“找不到或无法加载主类”问题

    解决思路: 从网上查找原因和解决方法,有提到环境变量classpath设置问题,但多次尝试问题依旧没有解决.然后使用java -cp %classpath; Hello执行,结果正确. 使用echo  ...

  10. uitextfield动态限制输入的字数-b

    1.定义一个事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...