【BZOJ3887】【Usaco2015 Jan】Grass Cownoisseur Tarjan+Spfa
我们可以看出这个东西可以缩点成DAG,因为我们在所称的点里用特技的话,要么没用,要么削弱自己对点的收割能力与边的联通权,所以我们缩完点之后在图上枚举反向的变,因为我们只可能反向一条边,而且我们知道在这条边上走的方向,那么我们一定是在边终点回去,在边起点来,因为一来一回的这两条路径一定没有交叉所以我们找着两条路径的最大值,我们跑两边SPFA就好了,(一边正向,一边反向)。
注意在无向图Tarjan时要穷举,因为一个点可能走不完。
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100005
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
inline int Min(int x,int y)
{
return x<y?x:y;
}
inline int Max(int x,int y)
{
return x>y?x:y;
}
int dfn[MAXN],low[MAXN],when,stack[MAXN],top;
struct Tr
{
int to,next,w;
}C[MAXN],c[MAXN<<];
int Head[MAXN],T,head[MAXN],t;
bool in[MAXN];
inline void Add(int x,int y)
{
C[++T].to=y;
C[T].next=Head[x];
Head[x]=T;
}
int belong[MAXN],sum[MAXN],num;
int n,m;
void Tarjan(int x)
{
low[x]=dfn[x]=++when;
stack[++top]=x;
in[x]=;
for(int i=Head[x];i;i=C[i].next)
{
int y=C[i].to;
if(!dfn[y])
{
Tarjan(y);
low[x]=Min(low[x],low[y]);
}
else if(in[y])
low[x]=Min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
int j;
num++;
do
{
j=stack[top--];
in[j]=;
belong[j]=num;
sum[num]++;
}while(j!=x);
}
}
inline void add(int x,int y,int z)
{
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
c[t].w=z;
}
struct E
{
int x,y;
}e[MAXN];
int sz;
inline void buildnew()
{
for(int x=;x<=n;x++)
{
for(int i=Head[x];i;i=C[i].next)
{
int y=C[i].to;
if(belong[x]==belong[y])continue;
e[++sz].x=belong[x];
e[sz].y=belong[y];
add(belong[x],belong[y],);
add(belong[y],belong[x],);
}
}
}
int S,q[MAXN],tail,dis_to[MAXN],dis_from[MAXN];
void spfa1()
{
memset(dis_from,-,sizeof(dis_from));
dis_from[S]=;
q[]=S;
top=tail=;
in[S]=;
while(top<=tail)
{
int x=q[top++];
in[x]=;
for(int i=head[x];i;i=c[i].next)
if(c[i].w==)
{
if(dis_from[x]+sum[c[i].to]>dis_from[c[i].to])
{
dis_from[c[i].to]=dis_from[x]+sum[c[i].to];
if(!in[c[i].to])
in[c[i].to]=,q[++tail]=c[i].to;
}
}
}
}
void spfa2()
{
memset(dis_to,-,sizeof(dis_to));
q[]=S;
top=tail=;
dis_to[S]=sum[S];
in[S]=;
while(top<=tail)
{
int x=q[top++];
in[x]=;
for(int i=head[x];i;i=c[i].next)
if(c[i].w)
{
if(dis_to[x]+sum[c[i].to]>dis_to[c[i].to])
{
dis_to[c[i].to]=dis_to[x]+sum[c[i].to];
if(!in[c[i].to])
in[c[i].to]=,q[++tail]=c[i].to;
}
}
}
}
inline void Init()
{
n=read(),m=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read();
Add(x,y);
}
for(int i=;i<=n;i++)
if(!dfn[i])
Tarjan(i);
buildnew();
S=belong[];
spfa1();
spfa2();
}
int ans;
inline void work()
{
ans=sum[S];
for(int i=;i<=sz;i++)
{
int x=e[i].y,y=e[i].x;
if(dis_to[x]==-||dis_from[y]==-)continue;
ans=Max(ans,dis_to[x]+dis_from[y]);
}
printf("%d",ans);
}
int main()
{
Init();
work();
return ;
}
【BZOJ3887】【Usaco2015 Jan】Grass Cownoisseur Tarjan+Spfa的更多相关文章
- BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA
考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...
- bzoj 3887: Grass Cownoisseur Tarjan+Topusort
题目: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) 题解: 首先考虑简单 ...
- BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*
BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...
- 【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur
草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...
- 【题解】洛谷P3119 Grass Cownoisseur G
题面:洛谷P3119 Grass Cownoisseur G 本人最近在熟悉Tarjan的题,刷了几道蓝题后,我飘了 趾高气扬地点开这道紫题,我一瞅: 哎呦!这不是分层图吗? 突然就更飘了~~~ 用时 ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- 【Python】【面向对象】
"""# [[面向对象]]#[访问限制]#如果要让内部属性不被外部访问,可加双下划线,编程私有变量.只有内部可以访问,外部不能访问.class Student(objec ...
- 【Ruby】【基础】
# [Ruby 块]=begin1 块由大量代码构成2 块中代码包含在{}内3 从与其相同名称的函数调用4 可以使用yield语句调用块=enddef test p '在test方法内' yield ...
随机推荐
- Jetson tx1 安装cuda错误
前两天安装Jetpack3.0的时候,看着网上的教程以为cuda会自动安装上,但是历经好几次安装,都安装不上cuda,也刷了好几次jetpack包.搜遍了网上的教程,也没有安装上.错误如下图所示: 这 ...
- 003---设计首页index页面
在项目的urls.py文件添加一条url from django.contrib import admin from django.urls import path, re_path from app ...
- (数据科学学习手札15)DBSCAN密度聚类法原理简介&Python与R的实现
DBSCAN算法是一种很典型的密度聚类法,它与K-means等只能对凸样本集进行聚类的算法不同,它也可以处理非凸集. 关于DBSCAN算法的原理,笔者觉得下面这篇写的甚是清楚练达,推荐大家阅读: ht ...
- 前端面试题目汇总摘录(JS 基础篇 —— 2018.11.02更新)
温故而知新,保持空杯心态 JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string type ...
- python2.7入门---网络编程(socket)
Python 提供了两个级别访问的网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别 ...
- win10 无法修改默认程序 默认打开方式的解决方法
此时是2018年11月24日 win10 pro 64位 版本是1803 具体版本号是17134 情景: 我的状况是.json文件的默认打开方式被新安装的应用霸占了,然后无论是通过“右键-属性-更改 ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- 存一些有用的CSS
reset ;} table{} fieldset,img{} address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;fon ...
- js数字格式化千分位格式
带小数点的 var a = 8462948.2453; console.log(a.toLocaleString()) //8,462,948.245 不带小数点的 num.toString().re ...
- Python 3基础教程23-多维列表
这里简单举例一个多维列表,多维看起来都很晕. # 多维列表 x = [ [5,6],[6,7],[7,2] ,[2,5] ,[4,9]] print(x) # 根据索引引用列表元素,例如打印[6,7] ...