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 =& ...
随机推荐
- Centos7更新阿里云的yum源
1.进入yum文件夹 cd /etc/yum.repos.d/ 2.下载阿里云源 wget "http://mirrors.aliyun.com/repo/Centos-7.repo&quo ...
- qtdomdocument找不到
- JMeter基础知识系列三
JMeter测试结果字段的意义: Label:定义HTTP请求名称. Samples:表示这次测试中一共发出了多少个请求. Average:平均响应时长,当使用了Transaction Control ...
- 阿里小哥带你玩转JVM:揭秘try-catch-finally在JVM底层都干了些啥?
让我们准备一个函数: 然后,反编译他的字节码: 首先我们介绍异常表:在编译生成的字节码中,每个方法都附带一个异常表. 异常表中的每一个条目代表一个异常处理器,并且由 from 指针.to 指针 ...
- JVM基础详解
JVM基础解析(一) Java里面有 JDK ,JRE, JVM ,这三者的关系是怎么样的呢? JDK是编译时环境: 整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库 ...
- HttpClient 如何设置超时时间
今天分享一个巨坑,就是 HttpClient.这玩意有多坑呢?就是每个版本都变,近日笔者深受其害. 先看一下代码,我要发送请求调用一个c++接口. public static String doPos ...
- java高并发系列 - 第13天:JUC中的Condition对象
本文目标: synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition实现生产者消费者 使用Condition实现同步阻塞队列 Object对 ...
- java高并发系列 - 第7天:volatile与Java内存模型
public class Demo09 { public static boolean flag = true; public static class T1 extends Thread { pub ...
- wpf listview images
<ListView x:Name="lv"> <ListView.ItemsPanel> <ItemsPanelTemplate> <St ...
- length()返回当前字符串的字符个数
package seday01;/** * int length() * 返回当前字符串的字符个数 * @author xingsir * */public class LengthDemo { pu ...