草鉴定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的更多相关文章

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

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

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

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

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

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

  4. 洛谷—— 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 ...

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

    屠龙宝刀点击就送 Tarjan缩点+拓扑排序 以后缩点后建图看n范围用vector ,或者直接用map+vector 结构体里数据要清空 代码: #include <cstring> #i ...

  6. 洛谷3119 [USACO15JAN]草鉴定Grass Cownoisseur

    原题链接 显然一个强连通分量里所有草场都可以走到,所以先用\(tarjan\)找强连通并缩点. 对于缩点后的\(DAG\),先复制一张新图出来,然后对于原图中的每条边的终点向新图中该边对应的那条边的起 ...

  7. P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...

  8. 洛谷P3119 USACO15JAN 草鉴定

    题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...

  9. luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...

  10. P3119 [USACO15JAN]草鉴定Grass Cownoisseur 分层图或者跑两次最长路

    https://www.luogu.org/problemnew/show/P3119 题意 有一个有向图,允许最多走一次逆向的路,问从1再走回1,最多能经过几个点. 思路 (一)首先先缩点.自己在缩 ...

随机推荐

  1. fiter 编码

    package com.itheima.web.filter; import java.io.IOException; import javax.servlet.Filter; import java ...

  2. Java实现Ip代理池

    设置Ip代理很多时候都会有用到,尤其是在写爬虫相关项目的时候.虽然自己目前没有接触这种需求,但由于最近比较闲,就写着当作练习吧 爬取代理IP 爬取 关于爬取代理IP,国内首先想到的网站当然是 西刺代理 ...

  3. Spring接收List型参数

    第一种形式: 提交的数据形式:id=1,2,3 --> urlEncoding -->  id=1%2C2%2C3 <form method="post" act ...

  4. Windows的任务管理器怎么显示进程的图标

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Windows的任务管理器怎么显示进程的图标.

  5. OLEDB事务

    学过数据的人一般都知道事务的重要性,事务是一种对数据源的一系列更新进行分组或者批处理以便当所有更新都成功时同时提交更新,或者任意一个更新失败时进行回滚将数据库中的数据回滚到执行批处理中的所有操作之前的 ...

  6. [转]滚动视差?CSS 不在话下/background attachment

      何为滚动视差 视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验. 作为网页设计的热点趋势,越来越多的网站应用了这项技术. ...

  7. html+css定位篇

    position absolute相对于父元素移动,不在父元素范围内时,可能和其他元素重叠 relative相对于初始位置来进行移动 fixed相对于浏览器进行定位,无论滑轮如何滚动,始终出现在浏览器 ...

  8. SQL Server 2008 R2如何开启数据库的远程连接(转)

    SQL Server 2008默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,远程连接数据库.需要做两个部分的配置: SQL Server Manag ...

  9. Easy deployment

    Use simple ssh and shell scripts to deploy, upgrade, rollback and reconfigure linux servers. https:/ ...

  10. SharePoint 2013 - REST Service

    0. SharePoint 2013使用_api来标识出 REST SERVICE,REST Service其实是 client.svc web service的一部分,但为了简化 REST URI的 ...