[补档][Usaco2015 Jan]Grass Cownoisseur
[Usaco2015 Jan]Grass Cownoisseur
题目
给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1)INPUT
The first line of input contains N and M, giving the number of fields and the number of one-way paths (1 <= N, M <= 100,000). The following M lines each describe a one-way cow path. Each line contains two distinct field numbers X and Y, corresponding to a cow path from X to Y. The same cow path will never appear more than once.N个点,M条有向边,无重边OUTPUT
A single line indicating the maximum number of distinct fields Bessiecan visit along a route starting and ending at field 1, given that she canfollow at most one path along this route in the wrong direction.SAMPLE
INPUT
7 101 23 12 52 43 73 53 66 57 24 7OUTPUT
6
解题报告
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<=''){
sum=sum*+ch-'';
ch=getchar();
}
return sum;
}
struct edge{
int s,e,n;
}k[],a[],b[];
int pre[],tot;
inline void insert(int s,int e){
k[++tot].s=s;
k[tot].e=e;
k[tot].n=pre[s];
pre[s]=tot;
}
int low[],dfn[],stack[],bl[],size[];
int head,cnt,qlt;
bool vis[];
inline int my_min(int a,int b){
return a<b?a:b;
}
inline int my_max(int a,int b){
return a>b?a:b;
}
inline void tarjan(int u){
low[u]=dfn[u]=++cnt;
vis[u]=;
stack[++head]=u;
for(int i=pre[u];i!=-;i=k[i].n){
int e(k[i].e);
if(!dfn[e]){
tarjan(e);
low[u]=my_min(low[u],low[e]);
}
else
if(vis[e])
low[u]=my_min(low[u],dfn[e]);
}
if(low[u]==dfn[u]){
int tmp;
qlt++;
while(){
tmp=stack[head--];
bl[tmp]=qlt;
vis[tmp]=;
if(tmp==u)
break;
}
}
}
int adj[],num;
inline void add(int s,int e){
a[++num].s=s;
a[num].e=e;
a[num].n=adj[s];
adj[s]=num;
}
queue<int>q;
int fz[];
inline void spfa1(int x){
memset(vis,,sizeof(vis));
memset(fz,,sizeof(fz));
q.push(x);
fz[x]=size[x];
vis[x]=;
while(!q.empty()){
int k(q.front());
q.pop();
for(int i=adj[k];i!=-;i=a[i].n){
int e(a[i].e);
if(fz[e]<fz[k]+size[e]){
fz[e]=fz[k]+size[e];
if(!vis[e]){
q.push(e);
vis[e]=;
}
}
}
vis[k]=;
}
}
int hhh,nxt[];
inline void init(int s,int e){
b[++hhh].s=s;
b[hhh].e=e;
b[hhh].n=nxt[s];
nxt[s]=hhh;
}
int ff[];
inline void spfa2(int x){
memset(vis,,sizeof(vis));
memset(ff,,sizeof(ff));
q.push(x);
ff[x]=size[x];
vis[x]=;
while(!q.empty()){
int k(q.front());
q.pop();
for(int i=nxt[k];i!=-;i=b[i].n){
int e(b[i].e);
if(ff[e]<ff[k]+size[e]){
ff[e]=ff[k]+size[e];
if(!vis[e]){
q.push(e);
vis[e]=;
}
}
}
vis[k]=;
}
}
inline int find(int x){
int s(a[x].e),e(a[x].s);
if(!fz[s]||!ff[e])
return ;
return fz[s]+ff[e]-size[bl[]];
}
int n,m;
int main(){
memset(pre,-,sizeof(pre));
memset(adj,-,sizeof(adj));
memset(nxt,-,sizeof(nxt));
n=read(),m=read();
for(int i=;i<=m;i++){
int x(read()),y(read());
insert(x,y);
}
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n;i++)
size[bl[i]]++;
for(int i=;i<=tot;i++){
int s(k[i].s),e(k[i].e);
if(bl[s]!=bl[e])
add(bl[s],bl[e]),init(bl[e],bl[s]);
}
spfa1(bl[]);
spfa2(bl[]);
int ans();
for(int i=;i<=num;i++)
ans=my_max(ans,find(i));
printf("%d\n",ans);
}
[补档][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
题意: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为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所在强连通分量 ...
- BZOJ3887 [Usaco2015 Jan]Grass Cownoisseur[缩点]
首先看得出缩点的套路.跑出DAG之后,考虑怎么用逆行条件.首先可以不用,这样只能待原地不动.用的话,考虑在DAG上向后走,必须得逆行到1号点缩点后所在点的前面,才能再走回去. 于是统计从1号点缩点所在 ...
- BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp
[Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...
随机推荐
- 伞兵(Paratroopers)
伞兵(Paratroopers) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 公元 2500 年,地球和火星之间爆发了一场战争.最近,地球军队指挥官获悉火星入侵者将派一些伞兵来摧毁地 ...
- Linux 中最常用的目录及文件管理命令
一.查看文件的命令 对于一个文本文件,在linux中有多种查看方式来获知文件内容,如直接显示整个文本内容.分页查看内容.或者只查看文件开头或末尾的部分内容.在linux可以用不同的命令来实现. 1. ...
- Tomcat7的热部署
所谓热部署就是在tomcat不停机的情况下,将新的war包放上去,达到服务不中断,用户无察觉的目的,实现的原理很简单,这里做下记录,以便后期查看. 1.1 安装tomcat7 略 1.2 在tomca ...
- phpcms和php格式化时间戳
用PHPCMS V9 建站时,经常会用到时间标签,它是通用标签调用-日期时间格式化,适用全站. 一.日期时间格式化显示: a\标准型:{date('Y-m-d H:i:s', $rs['inputti ...
- USACO Healthy Holsteins
首先看题目: Healthy HolsteinsBurch & Kolstad Farmer John prides himself on having the healthiest dair ...
- C语言之复杂链表的复制(图示详解)
什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点.今天我们要 ...
- grep[行号&正则匹配字符有颜色]
事情是这样的,昨天在深入学习grep命令时,看到别人博客用grep正则匹配,不仅行数有颜色,而且匹配到的字符也有颜色.我在CRT也试了下,毛颜色都没有.顿时感觉 so low. 解决 编辑vim~/. ...
- http(一)web和网络基础
深入学习http不为别的,只为补充底层知识,打好根基,深入了解其他技术,擒贼先擒王,学好九阳神功以后,乾坤大挪移,太极剑就容易了,急于求成,就只能变周芷若.走着...... 来源于:图解HTTP 1. ...
- javascript运动框架(二)
紧接着上面写的... 给div加一个边框,border:1px solid black window.onload = function(){ var div = document.getE ...
- 【亲测】Appium测试Android混合应用时,第二次切换到WebView失败
要解决的问题:Appium测试Android混合应用时,第二次切换到WebView时失败 原因分析:在用Appium测试Android混合应用时,当程序第一次切换到WebView时,可以正常进行自动化 ...