【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur
草鉴定Grass Cownoisseur
约翰有n块草场,编号1到n,这些草场由若干条单行道相连。奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草。
贝西总是从1号草场出发,最后回到1号草场。她想经过尽可能多的草场,贝西在通一个草场只吃一次草,所以一个草场可以经过多次。因为草场是单行道连接,这给贝西的品鉴工作带来了很大的不便,贝西想偷偷逆向行走一次,但最多只能有一次逆行。问,贝西最多能吃到多少个草场的牧草。
如果没有逆行操作和回到1的限制,我们很容易想到一种方法:
Tarjan缩点,再 记忆化搜索/拓扑排序 一遍,求出一条最长的链
如果加上回到1的限制:只能走一遍1所在的连通块
再加上逆行操作,就有些复杂了,
因为只有一次逆行操作,我们可以建一个分层图,
第一层的点和第二层的点连一条与第一层中方向相反的边
SPFA求最长路即可
为什么不会走除了1以外重复的点:若到达第二层后,
又走到了在第一层中走过的点,由于DAG的性质,
它是无法再走到1的,不会产生影响
#include<algorithm>
#include<cstdio>
#include<queue>
#define N 100010
#define min(a,b) (a<b?a:b)
int n,m,head[N],to[N],next[N],num;
const int ch_top=4e7+;
char ch[ch_top],*now_r=ch-,*now_w=ch-;
inline int read(){
while(*++now_r<'');
register int x=*now_r-'';
while(*++now_r>='')x=x*+*now_r-'';
return x;
}
struct HA{
int pos,val;
};
struct cmp{
inline bool operator()(HA a,HA b){
return a.val>b.val;
}
};
std::priority_queue< HA, std::vector<HA>, cmp > q;
int dfn[N],low[N],tot;
int size[N<<],belong[N],cnt;
int stack[N],top;
bool ins[N];
void Tarjan(int u){
dfn[u]=low[u]=++tot;
stack[++top]=u; ins[u]=;
for(int i=head[u];i;i=next[i]){
int v=to[i];
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
belong[u]=++cnt;
size[cnt]=;
while(stack[top]!=u){
int k=stack[top];
belong[k]=cnt;
++size[cnt];
ins[k]=; --top;
} --top; ins[u]=;
}
}
int Head[N<<],Next[N<<],To[N<<],Num,dis[N<<];
bool inque[N<<];
int main()
{
fread(ch,,ch_top,stdin);
n=read(); m=read();
int x,y;
for(int i=;i<=m;i++){
x=read(); y=read();
to[++num]=y;
next[num]=head[x];
head[x]=num;
}
for(int i=;i<=n;i++)
if(!dfn[i]) Tarjan(i);
for(int i=;i<=cnt;i++) size[i+cnt]=size[i];
for(int i=;i<=n;i++)
for(int j=head[i];j;j=next[j]){
int v=to[j]; x=belong[i],y=belong[v];
if(x==y) continue;
To[++Num]=y; Next[Num]=Head[x];
Head[x]=Num; To[++Num]=x+cnt;
Next[Num]=Head[y]; Head[y]=Num;
To[++Num]=y+cnt;
Next[Num]=Head[x+cnt];
Head[x+cnt]=Num;
}
std::fill(dis,dis++cnt*,-);
dis[belong[]]=;
q.push((HA){belong[],});
while(!q.empty()){
int u=q.top().pos; inque[u]=;
q.pop();
for(int i=Head[u];i;i=Next[i]){
int v=To[i];
if(dis[v]>dis[u]+size[v]) continue;
dis[v]=dis[u]+size[v];
if(!inque[v]){
inque[v]=;
q.push((HA){v,dis[v]});
}
}
}
printf("%d\n",dis[belong[]+cnt]);
return ;
}
【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur的更多相关文章
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...
- 洛谷——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 || 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 ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur
屠龙宝刀点击就送 Tarjan缩点+拓扑排序 以后缩点后建图看n范围用vector ,或者直接用map+vector 结构体里数据要清空 代码: #include <cstring> #i ...
- 洛谷3119 [USACO15JAN]草鉴定Grass Cownoisseur
原题链接 显然一个强连通分量里所有草场都可以走到,所以先用\(tarjan\)找强连通并缩点. 对于缩点后的\(DAG\),先复制一张新图出来,然后对于原图中的每条边的终点向新图中该边对应的那条边的起 ...
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- 洛谷P3119 USACO15JAN 草鉴定
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur 分层图或者跑两次最长路
https://www.luogu.org/problemnew/show/P3119 题意 有一个有向图,允许最多走一次逆向的路,问从1再走回1,最多能经过几个点. 思路 (一)首先先缩点.自己在缩 ...
随机推荐
- (转)netstat 命令详解
netstat 命令详解 原文:https://www.cnblogs.com/xieshengsen/p/6618993.html netstat命令是一个监控TCP/IP网络的非常有用的工具,它 ...
- 安装wine
sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo apt-get install winetricks
- <div>里用display:block有用么?
对所有的块元素都没有意义,块元素的dispaly属性默认值为block,没必要再显式定义--除非你之前对块元素的display属性重新定义过. =========================== ...
- NetCDF 共享软件 中文
NetCDF 共享软件 转载 在 Models-3 模式中,使用的数据存取接口称为 I/O API,其实就是 NetCDF 文件格式.而由于我们需要了解 Models-3 输出档案的数据情况,因此 ...
- 02.ArrayList和HashTable
ArrayList集合 数组的缺点: (1).数组只能存储相同类型的数据. (2).数组的长度要在定义时确定. 集合的好处: (1).集合可以存储多种不同类型的数据. (2).集合的长度是可以任意改变 ...
- 希尔排序——Java实现
一.排序思想 希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: 随着步长逐渐减小,所 ...
- 冒泡排序——Java实现
一.排序思想 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤, ...
- linux shell内置判断
内置判断,成功的时候返回0,不成功返回非零 test 判断表达式 [ 判断表达式 ] 注意前后必须留空格哦 数值运算 -eq 等于 -ne 不等于 -gt 大于 -ge ...
- Maven学习篇一:依赖了解
1.依赖配置 <project> ... <dependencies> <dependency> <groupId>xx</groupId> ...
- 用户选择wordpress程序建站需要知道的一些事情 - 安全、优化速度、配置
WordPress是我们使用最多的CMS程序之一,无论是我们的个人博客,还是企业网站,甚至中小型站点,我们都可以用WP程序部署.我们看到海外网站的时候,大部分都是用的WORDPRESS程序.在我们国人 ...