[USACO15JAN]草鉴定Grass Cownoisseur (分层图,最长路,$Tarjan$)
题目链接
Solution
水水的套路题。
可以考虑到一个环内的点是可以都到达的,所以 \(tajan\) 求出一个 \(DAG\) 。
然后 \(DAG\) 上的点权值就是 \(scc\) 的大小。
对于那条可以反的边,直接建两层图就好了。
最后跑最长路,第一个节点的 \(scc\) 在第二张图上的对应节点的答案即为答案。
Code
#include<bits/stdc++.h>
#define N 200008
#define in(x) x=read()
using namespace std;
int read()
{
char ch=getchar();int f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return f*w;
}
struct sj{int fr,to,next,w;}a[N*4];
int dfn[N],low[N],cnt;
int bl[N],siz[N];
int head[N],size,n,m;
int sta[N],top,v[N],tot,dis[N];
void add(int x,int y,int w)
{
a[++size].to=y;
a[size].fr=x;
a[size].next=head[x];
head[x]=size;
a[size].w=w;
}
void tarjan(int x)
{
dfn[x]=low[x]=++tot;
sta[++top]=x; v[x]=1;
for(int i=head[x];i;i=a[i].next)
{
int tt=a[i].to;
if(!dfn[tt]){
tarjan(tt);
low[x]=min(low[x],low[tt]);
}
else if(v[tt]) low[x]=min(low[x],dfn[tt]);
}
if(dfn[x]==low[x])
{
v[x]=0;
bl[x]=++cnt;
do{
siz[cnt]++;
v[sta[top]]=0;
bl[sta[top]]=cnt;
}while(sta[top--]!=x);
}
}
void SPFA()
{
memset(v,0,sizeof(v));
int s=bl[1],t=bl[1]+cnt;
queue<int>q; q.push(s); v[s]=1; dis[s]=0;
while(!q.empty())
{
int x=q.front();q.pop();v[x]=0;
for(int i=head[x];i;i=a[i].next)
{
int tt=a[i].to;
if(dis[tt]<dis[x]+a[i].w)
{
dis[tt]=dis[x]+a[i].w;
if(!v[tt]) q.push(tt),v[tt]=1;
}
}
}
printf("%d",dis[bl[1]+cnt]);
}
int main()
{
in(n),in(m);
for(int i=1;i<=m;i++)
{
int x,y; in(x),in(y);
add(x,y,0);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++)
{
int tt=a[i].to,fr=a[i].fr;
if(bl[tt]!=bl[fr])
{
add(bl[fr],bl[tt],siz[bl[fr]]);
add(bl[fr]+cnt,bl[tt]+cnt,siz[bl[fr]]);
add(bl[tt],bl[fr]+cnt,siz[bl[tt]]);
}
}
memset(dis,-1,sizeof(dis));
SPFA();
return 0;
}
[USACO15JAN]草鉴定Grass Cownoisseur (分层图,最长路,$Tarjan$)的更多相关文章
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur 分层图或者跑两次最长路
https://www.luogu.org/problemnew/show/P3119 题意 有一个有向图,允许最多走一次逆向的路,问从1再走回1,最多能经过几个点. 思路 (一)首先先缩点.自己在缩 ...
- [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)
[USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...
- 洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...
- 【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur
草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- [Luogu P3119] [USACO15JAN]草鉴定Grass Cownoisseur (缩点+图上DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3119 Solution 这题显然要先把缩点做了. 然后我们就可以考虑如何处理走反向边的问题. 像我这样的 ...
- luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
随机推荐
- CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第二节
原文链接 第二节:第一个内核 Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的实验室进行大型并 ...
- Java之JDK的下载与安装,java环境变量的配置,Editplus的下载与使用
JRE(Java Runtime Environment Java运行环境) 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发 ...
- SQL查询出每门课都大于80 分的学生姓名
Course表如下: 查询出每门课都大于80 分的学生姓名有两种方法. 1.select distinct name from Course where name not in (select di ...
- 理解Express 中间件
Express 中间件 Express程序基本上是一系列中间件函数的调用.中间件就是一个函数, 接受 req.res.next几个参数. 中间件函数可以执行任何代码, 对请求和响应对象进行修改, 结束 ...
- python实现批量修改文件名
import os def dele(): # 设置一个计数器 n=0 st = input('请输入你要删除的字符:') for i in f: b = f[n] if st in b: oldna ...
- node 发送邮件demo (QQ邮箱)
nodemailer是nodejs中的邮件发送模块,本文使用的版本为2.5.0 --下载模块 npm install nodemailer npm下载模块后,在项目中引入就可以使用: var node ...
- 三十五、MySQL 运算符
MySQL 运算符 本章节我们主要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算 ...
- LeetCode954二倍数对数组
问题:二倍数对数组 给定一个长度为偶数的整数数组 A,只有对 A 进行重组后可以满足 “对于每个 0 <= i < len(A) / 2,都有 A[2 * i + 1] = 2 * A[2 ...
- ThinkPHP邮件发送S(Smtp + Mail + phpmailer)
三种邮件发送介绍:(Smtp,Mail以及phpmailer)ThinkPhp 框架下开发. 邮件发送配置先前准备(用该账号做测试用):(这里用新浪邮箱服务器)将自己的新浪邮箱开通 POP3/SMTP ...
- django之media配置
一.没有配置Media avatar = models.FileField(upload_to='avatars/', default='/avatars/default.png') # 储存头像的m ...