bzoj3887: [Usaco2015 Jan]Grass Cownoisseur
题意:
给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1)
=>有向图我们先考虑缩点。然后观察缩点后的图可以发现新的路径中必定只有一条边是反向的才符合条件。那么我们可以联想到某道最短路的题将边反向存一遍后分别从s和t跑一跑。那么这里bfs跑一跑就行了。然后有一个坑点:这种重建图的注意es和edges不然es会在中途就被修改掉了。。。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define qwq(x) for(edge *o=head[x];o;o=o->next)
#define qaq(x) for(edge *o=hd[x];o;o=o->next)
#define TAT(x) for(edge *o=eo[x];o;o=o->next)
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=1e5+5;
const int inf=0x7f7f7f7f; struct edge{
int to;edge *next;
};edge es[nmax],edges[nmax<<1],*pt=es,*head[nmax],*hd[nmax],*eo[nmax];
void add(int u,int v){
pt->to=v;pt->next=head[u];head[u]=pt++;
}
void adde(int u,int v){
pt->to=v;pt->next=hd[u];hd[u]=pt++;
pt->to=u;pt->next=eo[v];eo[v]=pt++;
}
int pre[nmax],dfs_clock=0,scc_cnt=0,sccno[nmax],sm[nmax];
stack<int>s;
int dfs(int x){
int lowu=pre[x]=++dfs_clock;s.push(x);
qwq(x){
if(!pre[o->to]) lowu=min(lowu,dfs(o->to));
else if(!sccno[o->to]) lowu=min(lowu,pre[o->to]);
}
if(lowu==pre[x]){
++scc_cnt;int tc=0;
while(1){
int tx=s.top();s.pop();
sccno[tx]=scc_cnt;++tc;
if(x==tx) break;
}
sm[scc_cnt]=tc;
}
return lowu;
} queue<int>q;bool vis[nmax];int f[nmax],g[nmax];
int test_cnt=0;
void bfs1(int x){
q.push(x);f[x]=sm[x];int tx;clr(vis,0);
while(!q.empty()){
tx=q.front();q.pop();vis[tx]=0;
qaq(tx) if(f[o->to]<f[tx]+sm[o->to]){
f[o->to]=f[tx]+sm[o->to];
if(!vis[o->to]) q.push(o->to),vis[o->to]=1;
}
}
}
void bfs2(int x){
q.push(x);g[x]=sm[x];int tx;clr(vis,0);
while(!q.empty()){
tx=q.front();q.pop();vis[tx]=0;
TAT(tx) if(g[o->to]<g[tx]+sm[o->to]){
g[o->to]=g[tx]+sm[o->to];
if(!vis[o->to]) q.push(o->to),vis[o->to]=1;
}
}
} int main(){
int n=read(),m=read(),u,v;
rep(i,1,m) u=read(),v=read(),add(u,v);
rep(i,1,n) if(!pre[i]) dfs(i);
//rep(i,1,n) printf("%d ",sccno[i]);printf("\n"); pt=edges;
rep(i,1,n) qwq(i) if(sccno[i]!=sccno[o->to]) adde(sccno[i],sccno[o->to]);
bfs1(sccno[1]);bfs2(sccno[1]);
//rep(i,1,scc_cnt) printf("%d %d\n",f[i],g[i]); int ans=sm[sccno[1]];
rep(i,1,scc_cnt) qaq(i) {
if(g[i]&&f[o->to]) ans=max(ans,g[i]+f[o->to]-sm[sccno[1]]);
}
printf("%d\n",ans);return 0;
}
3887: [Usaco2015 Jan]Grass Cownoisseur
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 179 Solved: 92
[Submit][Status][Discuss]
Description
In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-way cow paths all over his farm. The farm consists of N fields, conveniently numbered 1..N, with each one-way cow path connecting a pair of fields. For example, if a path connects from field X to field Y, then cows are allowed to travel from X to Y but not from Y to X. Bessie the cow, as we all know, enjoys eating grass from as many fields as possible. She always starts in field 1 at the beginning of the day and visits a sequence of fields, returning to field 1 at the end of the day. She tries to maximize the number of distinct fields along her route, since she gets to eat the grass in each one (if she visits a field multiple times, she only eats the grass there once). As one might imagine, Bessie is not particularly happy about the one-way restriction on FJ's paths, since this will likely reduce the number of distinct fields she can possibly visit along her daily route. She wonders how much grass she will be able to eat if she breaks the rules and follows up to one path in the wrong direction. Please compute the maximum number of distinct fields she can visit along a route starting and ending at field 1, where she can follow up to one path along the route in the wrong direction. Bessie can only travel backwards at most once in her journey. In particular, she cannot even take the same path backwards twice.
给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1)
Input
Output
Sample Input
1 2
3 1
2 5
2 4
3 7
3 5
3 6
6 5
7 2
4 7
Sample Output
HINT
Source
bzoj3887: [Usaco2015 Jan]Grass Cownoisseur的更多相关文章
- BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*
BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...
- BZOJ3887 [Usaco2015 Jan]Grass Cownoisseur[缩点]
首先看得出缩点的套路.跑出DAG之后,考虑怎么用逆行条件.首先可以不用,这样只能待原地不动.用的话,考虑在DAG上向后走,必须得逆行到1号点缩点后所在点的前面,才能再走回去. 于是统计从1号点缩点所在 ...
- [补档][Usaco2015 Jan]Grass Cownoisseur
[Usaco2015 Jan]Grass Cownoisseur 题目 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过? (一个点在路 ...
- [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp
[Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...
- 洛谷—— 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 ...
- [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA
考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...
- [Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa
先缩点,对于缩点后的DAG,正反跑spfa,枚举每条边进行翻转即可 #include<cstdio> #include<cstring> #include<iostrea ...
- BZOJ 3887/Luogu P3119: [Usaco2015 Jan]Grass Cownoisseur (强连通分量+最长路)
分层建图,反向边建在两层之间,两层内部分别建正向边,tarjan缩点后,拓扑排序求一次1所在强连通分量和1+n所在强联通分量的最长路(长度定义为路径上的强联通分量内部点数和).然后由于1所在强连通分量 ...
- BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
随机推荐
- C4-总结
呃,很难受的比赛,中途做到口干舌燥还想尿尿//哦,题目,出的很棒,什么都可以做做,什么都做不下来. 怎么说呢?好像也没犯什么错误,除了日常开始手抖了一下...后面状态进入挺快的,而且遗憾?3-2吧,t ...
- 51nod1521(set.upper_bound())
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521 题意:中文题诶- 思路: 我们先看一下set容器的三个 ...
- [Xcode 实际操作]四、常用控件-(4)UILabel文本标签的自动换行
目录:[Swift]Xcode实际操作 本文将演示标签控件的换行功能, 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class Vie ...
- 安居客scrapy房产信息爬取到数据可视化(上)-scrapy爬虫
出发点 想做一个地图热力图,发现安居客房产数据有我要的特性.emmm,那就尝试一次好了~ 老规矩,从爬虫,从拿到数据开始... scrapy的配置 创建一个项目(在命令行下敲~): scrapy st ...
- input[checkbox],input[radiobox]的一些问题
复选框和文字对不齐:checkbox复选框的一些深入研究与理解: 解决方案:复选框或单选框与文字对齐的问题的深入研究与一 实例:实例.
- codeforces round 472(DIV2)D Riverside Curio题解(思维题)
题目传送门:http://codeforces.com/contest/957/problem/D 题意大致是这样的:有一个水池,每天都有一个水位(一个整数).每天都会在这一天的水位上划线(如果这个水 ...
- 牛客练习赛43F(推式子)
要点 题目链接 1e18的数据无法\(O(n)\)的容斥,于是推式子,官解,其中式子有点小错误 不必预处理mu,直接按照素数的个数判断正负即可 #include <bits/stdc++.h&g ...
- 如何自动更新SVN项目
在桌面新建“SVN Update.bat”文件,把下面的命令复制到该文件中,保存并退出,然后使用windows的“任务计划”功能,就可以实现定时自动更新SVN目录. 按此批处理文件的方法执行,一次可自 ...
- Spark Mllib里如何采用保序回归做回归分析(图文详解)
不多说,直接上干货! 相比于决策树,保序回归的应用范围没有决策树算法那么广泛. 特别在数据处理较为庞大的时候,采用保序回归做回归分析,可以极大地节省资源,从而提高计算效率. 保序回归的思想,是对数据进 ...
- 《从0到1学习Flink》—— 介绍Flink中的Stream Windows
前言 目前有许多数据分析的场景从批处理到流处理的演变, 虽然可以将批处理作为流处理的特殊情况来处理,但是分析无穷集的流数据通常需要思维方式的转变并且具有其自己的术语(例如,"windowin ...