洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告
P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述
约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连。奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草。
贝西总是从1号草场出发,最后回到1号草场。她想经过尽可能多的草场,贝西在通一个草场只吃一次草,所以一个草场可以经过多次。因为草场是单行道连接,这给贝西的品鉴工作带来了很大的不便,贝西想偷偷逆向行走一次,但最多只能有一次逆行。问,贝西最多能吃到多少个草场的牧草。
输入输出格式
输入格式:
第一行:草场数\(n\),道路数\(m\)。
以下\(m\)行,每行\(x\)和\(y\)表明有\(x\)到\(y\)的单向边,不会有重复的道路出现。
输出格式:
一个数,逆行一次最多可以走几个草场。
数据范围:
\(1<=N,M<=100,000\)
思路:先缩点,以新点的大小为点权,正反跑最长路,枚举每条边上的两个点更新答案。
需要注意的是,\(dis\)数组得先置\(-inf\),因为\(dis==0\)表示不可以到,但它可能更新答案。就这个卡了我两个月直到今天一位洛谷群群友@ysj1173886760才告诉我原因真是万分感谢
Code:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=100010;
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
struct Edge
{
int to,next;
}edge[N];
struct Edge0
{
int to,next,w;
}edge0[N<<1];
int head[N],cnt=0,head0[N],cnt0=0;
void add(int u,int v)
{
edge[++cnt].next=head[u];edge[cnt].to=v;head[u]=cnt;
}
void add0(int u,int v,int w)
{
edge0[++cnt0].next=head0[u];edge0[cnt0].to=v;edge0[cnt0].w=w;;head0[u]=cnt0;
}
int n,m;
int time=0,tot,s[N],dfn[N],is[N],low[N],ha[N],n0=0,siz[N],m_max=0,typ[N];
void tarjan(int now)
{
dfn[now]=low[now]=++time;
is[now]=1;
s[++tot]=now;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v);
low[now]=min(low[now],low[v]);
}
else if(is[v])
low[now]=min(low[now],dfn[v]);
}
if(dfn[now]==low[now])
{
int k;n0++;
do
{
k=s[tot--];
siz[n0]++;
is[k]=0;
ha[k]=n0;
}while(k!=now);
}
}
queue <int > q;
int used[N],dis[N];
void spfa(int ty)
{
q.push(ha[1]);
memset(used,0,sizeof(used));
while(!q.empty())
{
int u=q.front();
q.pop();
used[u]=0;
for(int i=head0[u];i;i=edge0[i].next)
{
int v=edge0[i].to,w=edge0[i].w;
if(w!=ty) continue;
if(dis[v]<dis[u]+siz[v])
{
dis[v]=dis[u]+siz[v];
if(!used[v])
{
used[v]=1;
typ[v]=ty;
q.push(v);
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=edge[j].next)
{
int v=edge[j].to;
if(ha[i]!=ha[v])
{
add0(ha[i],ha[v],1);
add0(ha[v],ha[i],0);
}
}
memset(dis,-0x3f,sizeof(dis));
dis[ha[1]]=0;
spfa(1);
spfa(0);
for(int i=1;i<=n0;i++)
if(ha[1]!=i)
for(int j=head0[i];j;j=edge0[j].next)
{
int v=edge0[j].to,w=edge0[j].w;
if((typ[i]^typ[v]||ha[1]==v)&&typ[i]^w)
m_max=max(m_max,dis[i]+dis[v]);
}
printf("%d\n",m_max+siz[ha[1]]);
return 0;
}
2018.7.26
洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告的更多相关文章
- 洛谷——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,最多能经过几个点. 思路 (一)首先先缩点.自己在缩 ...
随机推荐
- c的多态
使用函数数组,实现多态 参考my_strtoll10
- 【廖雪峰老师python教程】——进程与线程
多进程 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去.表面上看,每个任务都是交替执行的,但是,由于CPU ...
- Visual Studio 2015 Test Explorer does not show anything
Problem After install Visual Studio 2015 community and NUnit Test Adapter, I cannot find test cases ...
- ElasticSearch搜索引擎安装配置拼音插件pinyin
近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...
- RabbitMQ基础教程之Spring&JavaConfig使用篇
RabbitMQ基础教程之Spring使用篇 相关博文,推荐查看: RabbitMq基础教程之安装与测试 RabbitMq基础教程之基本概念 RabbitMQ基础教程之基本使用篇 RabbitMQ基础 ...
- 聊聊Bug引发事故该不该追求责任
最近读极客时间朱赟的一篇文章有感,在这也聊一下,在互联网的公司大多数以迭代的方式上线需求,节奏一般都比较快,经常会一个需求当天来了第二天就上线,开发和测试时间总共就两天,中间还穿插着别的需求测试,不像 ...
- JMeter自学笔记3-创建自己的第一个测试用例
一.写在前面的话: 上篇我们已经认识了JMeter的图形界面,大家应该都是很懵的.那么这篇,我们将学习使用JMeter创建第一个属于自己测试用例. 二.创建自己的第一个测试用例: 1.新建一个Thre ...
- leetcode-位1的个数(位与运算)
位1的个数 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000 ...
- wwnjld团队第二轮迭代成员分数
2014-01-05 第二轮迭代团队内成员分数如下(依据分数分配规则以及团队会议协商所得结果): 吴渊渊 23 汪仁贵 21.5 高小洲 19.5 聂建 22.5 吕家辉 23.5 程志 10
- java日期格式处理
继承关系:java.lang.Object->java.text.Format->java.text.DateForm->java.text.SimpleDateFormat 日期代 ...