P3119 [USACO15JAN] Grass Cownoisseur G

显然我们可以先跑强连通分量,由\(x\)个点缩成的新点\(u\)权值为\(v[u]=x\)。

下文中的节点\(1\)均表示缩点后节点\(1\)所在的节点。

我们在缩点后的DAG上跑拓扑排序,预处理出\(fa[i]\)和\(fb[i]\),分别表示“\(1\)到\(i\)路径的点权和”,“\(i\)到\(1\)路径的点权和”,后者可以建反图求解。

我们应该找到节点\(u,v\)使得:

  • \(1\)可以到达\(u\)
  • \(u\)到\(v\)有边
  • \(v\)可以到达\(1\)

这样一个合法的路径(\(1\)到\(u\),\(u\)逆行到\(v\),\(v\)到\(1\))就产生了,用\(fa[u]+fb[v]-v[1]\)更新答案即可。

注意,如果整个图是一个强连通分量,缩点后会只剩\(1\)个点,需要提前用\(v[1]\)更新答案,否则无法通过Subtask #1。

时间复杂度\(O(n+m)\)。

点击查看代码
#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,m,dfn[N],low[N],tim,st[N],top,ans;
int v[N],ori[N],dega[N],degb[N],fa[N],fb[N];
bitset<N> in_stack;
vector<int> G[N],Ga[N],Gb[N];
queue<int> q;
void tarjan(int u){
dfn[u]=low[u]=++tim;
st[++top]=u,in_stack[u]=1;
for(int i:G[u])
if(!dfn[i])
tarjan(i),
low[u]=min(low[u],low[i]);
else if(in_stack[i])
low[u]=min(low[u],dfn[i]);
if(dfn[u]==low[u]){
while(1){
int t=st[top--];
in_stack[t]=0,ori[t]=u,v[u]++;
if(t==u) break;
}
}
}
void topo(vector<int> G[],int deg[],int f[N],int s){
for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);
memset(f,0,sizeof(int));
while(!q.empty()){
int u=q.front();
q.pop();
if(u==s||f[u]) f[u]+=v[u];
for(int i:G[u]){
f[i]=max(f[i],f[u]);
deg[i]--;
if(!deg[i]) q.push(i);
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m;
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
G[u].emplace_back(v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
ans=v[ori[1]];
for(int i=1;i<=n;i++){
for(int j:G[i]){
if(ori[i]!=ori[j]){
Ga[ori[i]].emplace_back(ori[j]);
Gb[ori[j]].emplace_back(ori[i]);
dega[ori[j]]++,degb[ori[i]]++;
}
}
}
topo(Ga,dega,fa,ori[1]);
topo(Gb,degb,fb,ori[1]);
for(int i=1;i<=n;i++){
if(!fb[i]) continue;
for(int j:Ga[i]){
if(!fa[j]) continue;
ans=max(ans,fb[i]+fa[j]-v[ori[1]]);
}
}
cout<<ans<<"\n";
return 0;
}

[题解]P3119 [USACO15JAN] Grass Cownoisseur G的更多相关文章

  1. P3119 [USACO15JAN]Grass Cownoisseur G

    P3119 [USACO15JAN]Grass Cownoisseur G tarjan缩点+分层图上跑 spfa最长路 约翰有 \(n\) 块草场,编号 \(1\) 到 \(n\),这些草场由若干条 ...

  2. 【题解】洛谷P3119 Grass Cownoisseur G

    题面:洛谷P3119 Grass Cownoisseur G 本人最近在熟悉Tarjan的题,刷了几道蓝题后,我飘了 趾高气扬地点开这道紫题,我一瞅: 哎呦!这不是分层图吗? 突然就更飘了~~~ 用时 ...

  3. [USACO15JAN]Grass Cownoisseur

    \(tarjan\)缩点+\(DAG\)上最长路. 求一个以\(1\)为起点的最长路和一个以\(1\)为终点的最长路,然后找那个逆行边就行了. 然后这个我\(RE\)了好久,原因是\(vector\) ...

  4. 解题:USACO15JAN Grass Cownoisseur

    解题 首先缩点没啥可说的,然后考虑枚举这次逆行的边.具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑 ...

  5. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)

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

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

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

  7. 洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur

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

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

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

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

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

  10. bzoj3887: [Usaco2015 Jan]Grass Cownoisseur

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

随机推荐

  1. 信创-ORACLE迁移到DM8

    信创-ORACLE迁移到DM8 1. DM8实列初始化 安装可以直接参考官网安装说明(安装说明)[https://eco.dameng.com/document/dm/zh-cn/pm/install ...

  2. 爬虫(2)——requests以及xpath的使用

    一.requests requests.request(method,url,**kwargs) # 常见参数 # params/data/json 上传数据 # files 上传文件 # heade ...

  3. MyBatis实现对数据库的增删改查

    首先,整个项目的结构如图: 本次主要是对tb_brand表实现增删改查. 创建先后顺序 创建的先后顺序我在前一篇博客已经说清楚了,就不再赘述了,如果不知道如何创建的话,说明对mybatis还是不了解, ...

  4. HyperWorks二维网格划分及拓扑改进

    Step 01:载入模型 Exercise_3a.hm. Step 02:2D 网格划分. (1) 进入 automesh 面板. 图 3-13 设置 automesh 面板网格控制参数 (2) 指定 ...

  5. centos7搭建postgresql-14

    环境:centos7  + pg 14 1:在postgresql官网下载页面,根据提示下载 https://www.postgresql.org/download/linux/redhat/ 2 连 ...

  6. C++ pair对组 学习总结

    ----------------------------------------------pair对组 对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型两个值可以分别用pair的 ...

  7. AI编程实战:云开发疯狂助攻,React + Vite 做出 FPS 网页游戏不是梦

    回想起最初接触云开发的那段时间,我出于练手的目的,开发了一款基于 HTML 的简易枪战游戏.当我满怀期待地将其展示给玩家时,没想到却被一句点评当场"点醒"了:这不就是打地鼠的升级版 ...

  8. Xamarin.Android 开启网络请求- 网络权限

    https://blog.csdn.net/xujingcheng123/article/details/115968567 在文件 AndroidManifest.xml 配置    <use ...

  9. Layui 更新Table 表格内容的值

    $.ajax({ //请求方式 type: "POST", //请求地址 url: "/", //数据,json字符串 data: { }, //请求成功 su ...

  10. killall bluetoothd 一直不成功

    最后调查发现是bluetman 惹得祸 贴上他的守护程序,以后也可以写一个 #! /usr/bin/python3 from __future__ import print_function from ...