【洛谷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,最多能经过几个点. 思路 (一)首先先缩点.自己在缩 ...
随机推荐
- node之Express框架
Express是node的框架,通过Express我们快速搭建一个完整的网站,而不再只是前端了!所以Express还是非常值得学习的! express有各种中间件,我们可以在官方网站查询其用法. Ex ...
- opensuse13.1 安装 SqliteMan
Sqliteman是一个图形界面的sqliteman客户端 官网 http://www.sqliteman.com/ 1 添加源 http://download.opensuse.org/repos ...
- elasticSearch请求流程图
- pat02-线性结构1. Reversing Linked List (25)
02-线性结构1. Reversing Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, ...
- nyoj 1192——Salvation——————【搜索】
Salvation 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身. Klaus(吸血鬼祖先) 为了利用 ...
- 表单提交前的confirm验证提示
今天要做一个修改提交前的提示,点击修改按钮进行提示,然后根据confirm的结果来决定是否提交;发现平时很常见的一个功能,自己不会.所以只能去晚上找资料了; 举例如下: <form action ...
- Python sh模块--------替换subprocess的利器
官方文档有句话"allows you to call any program",并且: helps you write shell scripts in Python by giv ...
- git打补丁、还原补丁
打补丁.还原补丁 1.两个commit间的修改(包含两个commit,<r1>.<r2>表示两个提交的版本号,<r1>是最近提交) git format-patch ...
- java程序: 倒计时的小程序 (GridPane, Timer, Calendar, SimpleDateFormat ...)
倒计时程序 涉及到的东西: javafx简单的界面,布局,按钮,文本框,事件响应 java.util.Timer,用于定时 SimpleDateFormat用于在String和Date之间转换. ja ...
- 洛谷P1941 飞扬的小鸟(背包 dp)
题意 题目链接 Sol 很显然的dp,设\(f[i][j]\)表示第\(i\)个位置,高度为\(j\)的最小步数 向上转移的时候是完全背包 向下转移判断一下就可以 #include<bits/s ...