解题:USACO15JAN Grass Cownoisseur
首先缩点没啥可说的,然后考虑枚举这次逆行的边。具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑排序的复杂度是一样的=。=)
一个细节:注意可能整个图是个强连通分量,所以答案初始是起点所在的强联通分量的大小
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int dfn[N],low[N],col[N],stk[N],ins[N],inq[N],siz[N],dis[][N];
int p[N],noww[N],goal[N],P[N][],Noww[N][],Goal[N][];
int n,m,c,t1,t2,cnt,cnt0,cnt1,tot,top,ans;
queue<int> qs;
void link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void relink(int f,int t)
{
Noww[++cnt0][]=P[f][];
Goal[cnt0][]=t,P[f][]=cnt0;
Noww[++cnt1][]=P[t][];
Goal[cnt1][]=f,P[t][]=cnt1;
}
void Tarjan_SCC(int nde)
{
dfn[nde]=low[nde]=++tot;
stk[++top]=nde,ins[nde]=true;
for(int i=p[nde];i;i=noww[i])
if(!dfn[goal[i]])
Tarjan_SCC(goal[i]),low[nde]=min(low[nde],low[goal[i]]);
else if(ins[goal[i]])
low[nde]=min(low[nde],low[goal[i]]);
if(dfn[nde]==low[nde])
{
c++; int tmp;
do
{
tmp=stk[top--];
ins[tmp]=false;
col[tmp]=c,siz[c]++;
}while(nde!=tmp);
}
}
void Bellman_Ford(int s,int t)
{
memset(dis[t],0xc0,sizeof dis[t]);
dis[t][s]=siz[s],qs.push(s),inq[s]=true;
while(!qs.empty())
{
int tn=qs.front();
qs.pop(),inq[tn]=false;
for(int i=P[tn][t];i;i=Noww[i][t])
if(dis[t][Goal[i][t]]<dis[t][tn]+siz[Goal[i][t]])
{
dis[t][Goal[i][t]]=dis[t][tn]+siz[Goal[i][t]];
if(!inq[Goal[i][t]])
qs.push(Goal[i][t]),inq[Goal[i][t]]=true;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&t1,&t2),link(t1,t2);
for(int i=;i<=n;i++)
if(!dfn[i]) Tarjan_SCC(i);
for(int i=;i<=n;i++)
for(int j=p[i];j;j=noww[j])
if(col[i]!=col[goal[j]])
relink(col[i],col[goal[j]]);
Bellman_Ford(col[],),Bellman_Ford(col[],),ans=siz[col[]];
for(int i=;i<=c;i++)
for(int j=P[i][];j;j=Noww[j][])
ans=max(ans,dis[][i]+dis[][Goal[j][]]-siz[col[]]);
printf("%d",ans);
return ;
}
解题:USACO15JAN Grass Cownoisseur的更多相关文章
- P3119 [USACO15JAN]Grass Cownoisseur G
P3119 [USACO15JAN]Grass Cownoisseur G tarjan缩点+分层图上跑 spfa最长路 约翰有 \(n\) 块草场,编号 \(1\) 到 \(n\),这些草场由若干条 ...
- [USACO15JAN]Grass Cownoisseur
\(tarjan\)缩点+\(DAG\)上最长路. 求一个以\(1\)为起点的最长路和一个以\(1\)为终点的最长路,然后找那个逆行边就行了. 然后这个我\(RE\)了好久,原因是\(vector\) ...
- 洛谷 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 ...
- [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)
[USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...
- 洛谷 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
草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...
- [补档][Usaco2015 Jan]Grass Cownoisseur
[Usaco2015 Jan]Grass Cownoisseur 题目 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过? (一个点在路 ...
- BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*
BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...
随机推荐
- Swagger本地环境配置
一.技术背景 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远.而前后端的唯一联系便是 API 接口,与此同 ...
- SpringCloud学习:Eureka、Ribbon和Feign
Talk is cheap,show me the code , 书上得来终觉浅,绝知此事要躬行.在自己真正实现的过程中,会遇到很多莫名其妙的问题,而正是在解决这些问题的过程中,你会发现自己之前思维的 ...
- Scrum立会报告+燃尽图(Final阶段第五次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484 项目地址:https://coding.net/u/wuyy694 ...
- [BUAA软工]第0次个人作业
[BUAA软工]第0次个人作业 本次作业所属课程 : 2019BUAA软件工程 本次作业要求: 第0次个人作业 我在本课程的目标: 熟悉软件工程流程,规范开发习惯 本次作业的帮助: 熟悉课程流程 Pa ...
- Tomcat提高并发
Centos7环境下Tomcat 启动慢的解决方案1.增加熵值(本质增加random)安装软件 >> Yum –y install rng-tools 启动熵服务 >> Sys ...
- mysql hibernate 关于默认值
字段的默认值 写 NOT NULL DEFAULT 0 等等 一直不行, 算了 干脆在创建的时候 在代码set好了 版权声明:本文为博主原创文章,未经博主允许不得转载.
- mvc的过滤器学习-资料查询
标题:Filtering in ASP.NET MVC 地址:https://docs.microsoft.com/en-us/previous-versions/aspnet/gg416513(v= ...
- 26_多线程_第26天(Thread、线程创建、线程池)_讲义
今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...
- angularJS1笔记-(2)-$watch方法监听变量的变化
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- OSG学习:裁剪变换(2)
接着上一篇博客说. 还有一种裁剪的方法:osg::Scissor类. 这个类封装了OpenGL中的glScissor()函数. 该类主要用于设置一个视口裁剪平面举行.设置裁剪平面举行的函数如下: vo ...