LG3119 「USACO2015JAN」Grass Cownoisseur
问题描述
题解
显然,如果有个环,一定是全部走完的。
所以缩点,缩出一个 \(\mathrm{DAG}\) 。
只能走一次反向,于是在正图和反图上各跑一次,枚举边,取 \(\mathrm{max}\) 即可。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
#define maxn 100007
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') {
ch=getchar();fh=-1;
}
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
}
int n,dfn[maxn],low[maxn];
int m,Head1[maxn],Next1[maxn],to1[maxn],u1[maxn],tot1;
int Head2[maxn],Next2[maxn],to2[maxn],u2[maxn],tot2;
int Head3[maxn],Next3[maxn],to3[maxn],u3[maxn],tot3;
int xx,yy;
int stac[maxn],top,ind,cnt;
int sd[maxn],val[maxn];
bitset<maxn>ins;
void tarjan(int x){
dfn[x]=low[x]=++ind;stac[++top]=x;
ins[x]=1;
for(int i=Head1[x];i;i=Next1[i]){
int y=to1[i];
if(dfn[y]) {if(ins[y]) low[x]=min(low[x],dfn[y]);}
else{
tarjan(y);
low[x]=min(low[x],low[y]);
}
}
if(dfn[x]==low[x]){
cnt++;val[cnt]=1;
while(stac[top]!=x){
ins[stac[top]]=0;sd[stac[top]]=cnt;top--;++val[cnt];
}
sd[stac[top]]=cnt;top--;ins[x]=0;
}
}
void add1(int x,int y){
to1[++tot1]=y,Next1[tot1]=Head1[x],Head1[x]=tot1,u1[tot1]=x;
}
void add2(int x,int y){
to2[++tot2]=y,Next2[tot2]=Head2[x],Head2[x]=tot2,u2[tot2]=x;
}
void add3(int x,int y){
to3[++tot3]=y,Next3[tot3]=Head3[x],Head3[x]=tot3,u3[tot3]=x;
}
set <pair<int,int> > st;
void rebuild(){
for(register int i=1;i<=m;i++){
// if(sd[to1[i]]==0||sd[u1[i]]==0) continue;
int x=sd[u1[i]],y=sd[to1[i]];
if(st.count(make_pair(x,y))||x==y) continue;
st.insert((make_pair(x,y)));
add2(x,y);add3(y,x);
}
}
int dis[2][maxn];
void fir(){
memset(dis[0],0xcf,sizeof(dis[0]));
dis[0][sd[1]]=val[sd[1]];queue<int>q;q.push(sd[1]);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head2[x];i;i=Next2[i]){
int y=to2[i];
if(dis[0][y]>=dis[0][x]+val[y]) continue;
dis[0][y]=dis[0][x]+val[y];
q.push(y);
}
}
}
void sec(){
memset(dis[1],0xcf,sizeof(dis[1]));
dis[1][sd[1]]=val[sd[1]];queue<int>q;q.push(sd[1]);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head3[x];i;i=Next3[i]){
int y=to3[i];
if(dis[1][y]>=dis[1][x]+val[y]) continue;
dis[1][y]=dis[1][x]+val[y];
q.push(y);
}
}
}
int ans=0;
void calc(){
for(register int i=1;i<=tot2;i++){
int x=u2[i],y=to2[i];//错误笔记:写为to2[i],开-Wall之后会有警告。
ans=max(ans,dis[0][y]+dis[1][x]);
}
printf("%d\n",ans-val[sd[1]]);//错误笔记:将sd[1]写为1,所点后1所在的结点不一定是新1号点。
}
int main(){
read(n);read(m);
for(register int i=1;i<=m;i++){
read(xx);read(yy);add1(xx,yy);
}
for(register int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
// puts("********************************");
// printf("%d\n",cnt);
// system("pause");
// puts("********************************");
rebuild();
fir();sec();
calc();
return 0;
}
LG3119 「USACO2015JAN」Grass Cownoisseur的更多相关文章
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
随机推荐
- OSPF和ACL的应用
1.创建拓扑图 2.配置基本网络 3.配置OSPF (1)在R1上配置 (2)在R2上配置 (3)在R3上配置 (4)在IT上配置 4.配置ACL (1)在R3上配置 (2)在R2上配置 (3) ...
- Cent OS6.5——网络配置
1.已安装centos 系统,打开虚拟机,并开机进入centos系统 2.进行网络配置,必须先确认以下几个点: 2-1.网络适配器模式是否为NAT模式,点击虚拟机,选择设置 ——选择网络适配器,NAT ...
- 错题shell
1.判断/root/class21/inittab.txt文件是否大于100行,如果大于,则显示”inittab is a big file.”否者显示”inittab is a small file ...
- React中useEffect使用
2019-08-24 07:00:00 文摘资讯 阅读数 1364 收藏 博文的原始地址 之前我们已经掌握了useState的使用,在 class 中,我们通过在构造函数中设置 this.s ...
- Saiku上线部署准备(三十)
Saiku上线部署准备 零零散散琢磨了快5个月了,终于快要上线了哈哈哈哈哈..... 激动!!! 以下是本地打包编译saiku至部署到服务器上使用的完整步骤哦 saiku部署到服务器 源码编译需要注 ...
- 【linux命令】权限管理命令(chattr、lsattr、sudo)
目录 chattr lsattr sudo 一.chattr命令 chattr命令用来修改文件系统的权限属性,只有 root 用户可以使用,建立凌驾于 rwx 基础权限之上的授权. PS:chattr ...
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...
- Elastic:使用Heartbeat进行Uptime监控
Elastic:使用Heartbeat进行Uptime监控 Elastic在6.5的版本中推出Heartbeat.Heartbeat 也就是我们通常所说的心跳.我们知道在医院,医生是用听心跳来判断一个 ...
- 面试官常问的Nginx的那几个问题?
什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代 ...
- 在vcs中编译及运行测试E203例子
E203的Makefile默认是调用 iverilog编译rtl,我们可以做如下修改,使其支持vcs编译. 1. 首先修改e200_opensource/tb/tb_top.v, 增加dump波形的两 ...