Code:

#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 200002
using namespace std;
queue<int>Q;
stack<int>S;
vector<int>G[maxn],V[maxn];
map<int,int>mp[maxn];
int n,m,edges,scc,id;
int hd[maxn],to[maxn],nex[maxn],low[maxn],dfn[maxn],idx[maxn],vis[maxn],siz[maxn];
void addedge(int u,int v) {
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void tarjan(int u) {
S.push(u);
vis[u]=1, low[u]=dfn[u]=++scc;
for(int i=hd[u];i;i=nex[i]) {
int v=to[i];
if(!vis[v]) tarjan(v), low[u]=min(low[u], low[v]);
else if(vis[v]==1) low[u]=min(low[u], dfn[v]);
}
if(low[u]==dfn[u]) {
++id;
for(;;) {
int x=S.top(); S.pop();
idx[x]=id;
++siz[id];
vis[x]=-1;
if(x==u) break;
}
}
}
int h1[maxn],h2[maxn], vis1[maxn],vis2[maxn],inq[maxn], ge[maxn];
void spfa1() {
int s=idx[1];
Q.push(s);
inq[s]=1;
h1[s]=siz[s];
while(!Q.empty()) {
int u=Q.front(); Q.pop();
ge[u]=1;
inq[u]=0;
for(int i=0;i<G[u].size();++i) {
int v=G[u][i];
if(h1[v] < h1[u] + siz[v]) {
h1[v] = h1[u] + siz[v];
if(!inq[v]) {
Q.push(v);
inq[v]=1;
}
}
}
}
}
void spfa2() {
int s=idx[1];
Q.push(s);
inq[s]=1;
h2[s]=siz[s];
while(!Q.empty()) {
int u=Q.front(); Q.pop();
inq[u]=0;
for(int i=0;i<V[u].size();++i) {
int v=V[u][i];
if(h2[v] < h2[u] + siz[v]) {
h2[v] = h2[u] + siz[v];
if(!inq[v]) {
Q.push(v);
inq[v]=1;
}
}
}
}
}
int main() {
// setIO("input");
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) {
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
}
for(int i=1;i<=n;++i) if(!vis[i]) tarjan(i);
for(int i=1;i<=n;++i) {
int cur=idx[i];
for(int j=hd[i];j;j=nex[j]) {
int too=idx[to[j]];
if(cur!=too && !mp[cur][too]) {
mp[cur][too]=1;
G[cur].push_back(too);
V[too].push_back(cur);
}
}
}
spfa2();
spfa1();
int ans=siz[idx[1]];
int re=0;
for(int i=1;i<=id;++i) {
if(!ge[i]) continue;
for(int j=0;j<V[i].size();++j)
{
int v=V[i][j];
if(h1[i] && h2[v])ans=max(ans, h1[i] + h2[v]-siz[idx[1]]);
}
}
printf("%d\n",ans);
return 0;
}

  

BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa的更多相关文章

  1. 洛谷—— P3119 [USACO15JAN]草鉴定Grass Cownoisseur || BZOJ——T 3887: [Usaco2015 Jan]Grass Cownoisseur

    http://www.lydsy.com/JudgeOnline/problem.php?id=3887|| https://www.luogu.org/problem/show?pid=3119 D ...

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

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

  3. bzoj3887: [Usaco2015 Jan]Grass Cownoisseur

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

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

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

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

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

  6. [Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa

    先缩点,对于缩点后的DAG,正反跑spfa,枚举每条边进行翻转即可 #include<cstdio> #include<cstring> #include<iostrea ...

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

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

  8. BZOJ 3887/Luogu P3119: [Usaco2015 Jan]Grass Cownoisseur (强连通分量+最长路)

    分层建图,反向边建在两层之间,两层内部分别建正向边,tarjan缩点后,拓扑排序求一次1所在强连通分量和1+n所在强联通分量的最长路(长度定义为路径上的强联通分量内部点数和).然后由于1所在强连通分量 ...

  9. BZOJ3887 [Usaco2015 Jan]Grass Cownoisseur[缩点]

    首先看得出缩点的套路.跑出DAG之后,考虑怎么用逆行条件.首先可以不用,这样只能待原地不动.用的话,考虑在DAG上向后走,必须得逆行到1号点缩点后所在点的前面,才能再走回去. 于是统计从1号点缩点所在 ...

随机推荐

  1. 一文学会Rust?

    Rust是什么 Rust 是一个系统编程语言,它注重三个方面:安全,速度和并发性. 特征: 1.没有垃圾回收机制,没有运行时,效率超过c++,直逼c语言 2.内存安全,并发安全,没有空指针 3.极其丰 ...

  2. 12.持久性后门----Ettercap之ARP中毒----RAR/ZIP & linux密码破解----kali上检测rootkits

    持久性后门 生成PHP shell weevely generate 密码 /root/Desktop/404.php 靶机IP/404.php weevely http://192.168.1.10 ...

  3. return语句

    定义一个函数:可以定义一个由自己想要功能的函数,以下是简单的规则: (1).函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). (2).任何传入参数和自变量必须放在圆括号中间.圆括号之 ...

  4. [19/09/19-星期四] Python中的字典和集合

    一.字典 # 字典 # 使用 {} 来创建字典 d = {} # 创建了一个空字典 # 创建一个保护有数据的字典 # 语法: # {key:value,key:value,key:value} # 字 ...

  5. Python模块unittest

    Python自带一个单元测试框架,unittest模块,用它来做单元测试,它里面封装好了一些校验返回结果的方法和一些用例执行前的初始化操作 在说unittest之前,先说几个概念: TestCase: ...

  6. Nginx 的root和 alias

    nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alia ...

  7. 04: DjangoRestFramework使用

    Django其他篇 目录: 1.1 DjangoRestFramework基本使用 1.2 drf认证&权限 模块 1.3 djangorestframework 序列化 1.4 django ...

  8. tensorflow学习笔记六----------神经网络

    使用mnist数据集进行神经网络的构建 import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from ...

  9. nginx启动报错

    nginx启动的时候报错 nginx: [emerg] invalid number of arguments in "root" directive in /etc/nginx/ ...

  10. HTTP1.0、HTTP 1.1、HTTP 2.0之间的主要区别

    HTTP1.0与HTTP 1.1的主要区别  长连接 节约带宽 HOST域 HTTP1.1与HTTP 2.0的主要区别  多路复用 二进制分帧 首部压缩 服务器推送 一.HTTP1.0与HTTP 1. ...