题目:

给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1)

题解:

首先考虑简单一些的问题

如果没有逆向的机会,那么\(ans\)即为\(1\)所在的强连通分量的大小。

但是现在有一个逆向的机会

如果我们将缩点后的\(DAG\)搞出来的话就可以发现:

一定是从\(1\)的连通块出发走到别的地方然后通过走逆向边返回一个可以到达\(1\)的路径上。

那么我们可以预处理每个点到根的最大\(siz\)之和根到每个点的路上的最大\(siz\)之和。

然后枚举每条边进行\(O(1)\)判断即可.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 100010;
struct Edge{
int to,next;
}G[maxn];
int head[maxn],cnt;
void add(int u,int v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
int dfn[maxn],low[maxn],dfs_clock;
int sta[maxn],top,belong[maxn];
int scc_cnt,siz[maxn];
#define v G[i].to
void dfs(int u){
dfn[u] = low[u] = ++ dfs_clock;
sta[++top] = u;
for(rg i = head[u];i;i=G[i].next){
if(!dfn[v]){
dfs(v);
low[u] = min(low[u],low[v]);
}else if(!belong[v]) low[u] = min(low[u],dfn[v]);
}
if(dfn[u] == low[u]){
++ scc_cnt;
while(1){
int x = sta[top--];
belong[x] = scc_cnt;
siz[scc_cnt] ++ ;
if(x == u) break;
}
}
}
#undef v
struct Topu{
struct Edge{
int to,next;
}G[maxn];
int head[maxn],cnt,deg[maxn];
void add(int u,int v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
++ deg[v];
}
#define v G[i].to
int q[maxn],l,r,f[maxn];
void bfs(){
memset(f,-0x3f,sizeof f);
f[belong[1]] = siz[belong[1]];l = 0;r = -1;
rep(i,1,scc_cnt){
if(deg[i] == 0) q[++r] = i;
}
while(l <= r){
int u = q[l++];
for(rg i = head[u];i;i=G[i].next){
f[v] = max(f[v],f[u] + siz[v]);
if(-- deg[v] == 0) q[++r] = v;
}
}return ;
}
#undef v
}a,b;
struct Node{
int u,v;
}e[maxn];
int main(){
int n,m;read(n);read(m);
int u,v;
rep(i,1,m){
read(u);read(v);
e[i].u = u;e[i].v = v;
add(u,v);
}
rep(i,1,n) if(!dfn[i]) dfs(i);
rep(i,1,m){
if(belong[e[i].u] == belong[e[i].v]) continue;
a.add(belong[e[i].u],belong[e[i].v]);
b.add(belong[e[i].v],belong[e[i].u]);
}a.bfs();b.bfs();
int ans = siz[belong[1]] << 1;
rep(i,1,m){
if(belong[e[i].u] == belong[e[i].v]) continue;
ans = max(ans,a.f[belong[e[i].v]] + b.f[belong[e[i].u]]);
}
printf("%d\n",ans - siz[belong[1]]);
return 0;
}

bzoj 3887: Grass Cownoisseur Tarjan+Topusort的更多相关文章

  1. BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  2. [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA

    考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...

  3. 【BZOJ3887】【Usaco2015 Jan】Grass Cownoisseur Tarjan+Spfa

    我们可以看出这个东西可以缩点成DAG,因为我们在所称的点里用特技的话,要么没用,要么削弱自己对点的收割能力与边的联通权,所以我们缩完点之后在图上枚举反向的变,因为我们只可能反向一条边,而且我们知道在这 ...

  4. BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*

    BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...

  5. [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)

    [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...

  6. [补档][Usaco2015 Jan]Grass Cownoisseur

    [Usaco2015 Jan]Grass Cownoisseur 题目 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过? (一个点在路 ...

  7. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...

  8. 【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur

    草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...

  9. bzoj3887: [Usaco2015 Jan]Grass Cownoisseur

    题意: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) =>有向图我们 ...

随机推荐

  1. js文件操作

    IE下 1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码代码如下: Var fso=new ActiveXObject(Scripting.FileSys ...

  2. js判断有无属性

    访问元素属性 getAttribute 不存在返回null,特性名可不区分大小写 dom对象访问公共属性,自定义属性不能访问,div.id 访问对象属性 1.使用in关键字 该方法可以判断对象的自有属 ...

  3. C# XMLHttpRequest对象—Ajax实例

    Get: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  4. qt5.4.1的imx6编译

    2.到https://download.qt.io/archive/qt/5.4/5.4.1/single/下载源码包qt-everywhere-opensource-src-5.4.1.tar.gz ...

  5. 20145240 《Java程序设计》第五次实验报告

    20145240 <Java程序设计>第五次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.05.06 实验 ...

  6. iOS_mapKit与Core Location

    目 录: 一.使用MKMap控件 二.根据地址定位 三.在地图上添加锚点   iOS从3.0版本开始提供了MapKit.frameword支持.该框架提供了一个可被嵌入到应用程序中的地图视图类MKMa ...

  7. 通过公钥解密密文思路(256bits RSA)

    256bit RSA公钥安全系数极低,只需要几分钟即可破解密文,本文综合其他文章记录了一次解密256bits RSA加密的密文的过程,仅作为备忘. 1.分解公钥,分解出n与e: 1.1使用openss ...

  8. 微软官网的office外接程序开发

    链接地址:https://msdn.microsoft.com/zh-cn/library/fp161347.aspx

  9. 使用Navicat连接oracle时出现unsupported server character set ZHS16GBK的解决之道

    原文网址http://blog.mn886.net/chenjianhua/show/ba1dc6f835be403ea159b0a5e2685ff2/index.html ORA-12737:Ins ...

  10. nodejs mysql 操作数据库方法一详解

    nodejs mysql 数据查询例子 时间 2014-11-11 15:28:01  姜糖水原文  http://www.cnphp6.com/archives/59864 1.安装nodejs 2 ...