[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 Bessie
can visit along a route starting and ending at field 1, given that she can
follow at most one path along this route in the wrong direction.

SAMPLE

INPUT

7 10
1 2
3 1
2 5
2 4
3 7
3 5
3 6
6 5
7 2
4 7

OUTPUT

6

解题报告

这道题考试的时候,一看就知道是tarjan,然后就真的傻傻的打了个tarjan+dfs,就A了一个点= =
正解:
tarjan缩点,因为可以逆转一条边,而同一强连通分量里的边逆转是没啥用的,所以我们可以枚举缩点后的边。
首先,跑2遍SPFA,一遍缩点后的正边,一遍反边,处理出正反两个最大的经过权值(每点权值为缩点后强连通分量的点数)。
剩下的就很简单了,思考当一条有向边反过来时,它反边的起点走的是正向的最大权值,而终点则走的是反向的最大权值,那么我们枚举每一条边,两权相加求max即为答案。
注意:特判,两边SPFA若有一遍没有联通这条边对应的强连通分量,这个点就不能跑。
 #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);
}
ps:调了我两个小时,最后发现重新建边的时候我用的原来点的编号,没有用缩完点后的编号,然后就听取蛙声一片了= =

[补档][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 ...

  2. bzoj3887: [Usaco2015 Jan]Grass Cownoisseur

    题意: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) =>有向图我们 ...

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

  4. [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA

    考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...

  5. [Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa

    先缩点,对于缩点后的DAG,正反跑spfa,枚举每条边进行翻转即可 #include<cstdio> #include<cstring> #include<iostrea ...

  6. BZOJ 3887/Luogu P3119: [Usaco2015 Jan]Grass Cownoisseur (强连通分量+最长路)

    分层建图,反向边建在两层之间,两层内部分别建正向边,tarjan缩点后,拓扑排序求一次1所在强连通分量和1+n所在强联通分量的最长路(长度定义为路径上的强联通分量内部点数和).然后由于1所在强连通分量 ...

  7. BZOJ3887 [Usaco2015 Jan]Grass Cownoisseur[缩点]

    首先看得出缩点的套路.跑出DAG之后,考虑怎么用逆行条件.首先可以不用,这样只能待原地不动.用的话,考虑在DAG上向后走,必须得逆行到1号点缩点后所在点的前面,才能再走回去. 于是统计从1号点缩点所在 ...

  8. BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  9. [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp

    [Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...

随机推荐

  1. 关于 asp.net 点击确定按钮 获取不到新值问题

    点击事件内,可以使用request.form[" kk"] 获取到值,但是this.txt.Text 确实旧值, 尼玛,居然没加isPostBack重新加载了数据 ,request ...

  2. HTML特殊布局--------双飞翼布局

    今天看到以前写的一篇布局的例子分享给大家,双飞翼布局. 什么是双飞翼布局?? 1.三列布局,中间宽度自适应,两边固定宽度; 2.中间栏在浏览器中优先展示渲染: 双飞翼布局的原理: 中间的盒子定100% ...

  3. PS-前端切图教程(切jpg图和切png图)

    微微一运功,把家底都抖出来了. 不过,作为一个设计出身的前端来说,摸ps就和摸键盘一样了 所以可能教程中还是有没用过ps的人看不懂的地方, 欢迎加群讨论:613512106... ---------- ...

  4. mongodb取出最大值与最小值

    $res=self::aggregate([ ['$match'=>[ 'msg_id'=>1007, 'D'=>16, ]], ['$group'=>[ '_id'=> ...

  5. 【Android Developers Training】 103. 查询当前地点

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. C# 模拟跑马灯效果(2种)

    #region 跑马灯效果方法 /// <summary> /// 文字进入左侧后从右侧出来 /// </summary> private void LabelRun() { ...

  7. 词向量-LRWE模型

    上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述 ...

  8. v2013调试无法访问此网站 localhost 拒绝了我们的连接请求

    问题描述:          别人给的服务器代码,在本地部署以后调试的,localhost:8080 可以访问,localhost:2524访问不了需要改什么配置吗 解决思路:           这 ...

  9. 【PHP】最详细PHP从入门到精通(五)——PHP错误处理

     PHP从入门到精通 之PHP中的字符串 在创建脚本和 web 应用程序时,错误处理是一个重要的部分.如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门. 本教程介绍了 PH ...

  10. Pandas数据处理实战:福布斯全球上市企业排行榜数据整理

    手头现在有一份福布斯2016年全球上市企业2000强排行榜的数据,但原始数据并不规范,需要处理后才能进一步使用. 本文通过实例操作来介绍用pandas进行数据整理. 照例先说下我的运行环境,如下: w ...