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. .net core 学习小结之 JWT 认证授权

    新增配置文件 { "Logging": { "IncludeScopes": false, "Debug": { "LogLeve ...

  2. kafka producer发送消息 Failed to update metadata after问题

    提示示例: ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Fail ...

  3. RabbitMQ 安装步骤

    RabbitMQ安装步骤 一.安装erlang 1.下载erlang wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1 ...

  4. C函数调用过程原理及函数栈帧分析(转)

    在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等.一切的函数调用都要将不同的数据.地址压入或者弹出栈.因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么 ...

  5. 各类最新Asp .Net Core 项目和示例源码

    1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...

  6. 只使用非递归的mutex

    mutex分为递归(以下简写为rm)和非递归(以下简写为nrm)两种,它们的唯一区别在于:同一个线程可以重复对rm加锁,但是不能重复对nrm加锁. 虽然rm使用起来要更加方便一些,并且不用考虑一个线程 ...

  7. 搜索专题: HDU1372Knight Moves

    Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  8. 一条简单的 SQL 查询语句到底经历了什么?

    一.MySQL 基础架构   整体来说 MySQL 主要分为两个部分,一个部分是:Server 层,另一部分是:存储引擎层. 其中 Server 层包括有连接器.查询缓存.分析器.优化器.执行器等,存 ...

  9. activemq高可用

    这里是基于 zookeeper 选举方式实现的集群配置,服务器过半数才可提供服务,所以是2n+1台这里以三台为例. 只有master节点能提供服务,slave节点无法提供服务,只有当master节点挂 ...

  10. struts2_对Map进行双层迭代

    转自:struts2_对Map进行双层迭代 //后台数据 public String execute() throws Exception { Map<String, List<Produ ...