[USACO15JAN]Grass Cownoisseur
\(tarjan\)缩点+\(DAG\)上最长路。
求一个以\(1\)为起点的最长路和一个以\(1\)为终点的最长路,然后找那个逆行边就行了。
然后这个我\(RE\)了好久,原因是\(vector\)的\(size()\) \(return\)的是一个\(unsigned\ int\)值,如果直接\(size()-1\),会让显示的值变成\(Max\ Unsigned\ Int\),然后就RE了。。。问问问
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>
#include <queue>
#include <ctime>
#include <set>
#include <map>
#define fo(i,j,k) for(int i=(j);i<=(k);i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define go(i,k) for(int i=head[k],v=e[i].to;i;i=e[i].nxt,v=e[i].to)
using namespace std;
typedef long long ll;
typedef double db;
const int inf=0x3f3f3f3f;
inline int rd() {
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
return x*f;
}
const int M=100005,N=100005;
int n,m,dfn[N],low[N],tim,ecnt,head[N],stk[N],top,siz[N],col[N],cnt,dis1[N],dis2[N];
bool vis[N];
struct Edge{int to,nxt;}e[M];
vector<int>G[N],F[N];
void add(int bg,int ed) {e[++ecnt]=(Edge){ed,head[bg]};head[bg]=ecnt;}
void tarjan(int x) {
low[x]=dfn[x]=++tim;vis[x]=1;stk[++top]=x;
go(i,x) {
if(!dfn[v]) {
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if (vis[v]) low[x]=min(low[x],dfn[v]);
}
if(dfn[x]==low[x]) {
col[x]=++cnt;vis[x]=0;siz[cnt]=1;
while(stk[top]!=x) {
col[stk[top]]=cnt;
siz[cnt]++;
vis[stk[top]]=0;
top--;
}
top--;
}
}
queue<int>q;
void spfa1() {
memset(vis,0,sizeof vis);
q.push(col[1]);
dis1[col[1]]=siz[col[1]];
while(!q.empty()) {
int u=q.front();q.pop();vis[u]=0;
for(int i=0;i<G[u].size();i++) {
int v=G[u][i];
if(dis1[v]<dis1[u]+siz[v]) {
dis1[v]=dis1[u]+siz[v];
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
}
void spfa2() {
memset(vis,0,sizeof vis);
dis2[col[1]]=siz[col[1]];
q.push(col[1]);
while(!q.empty()) {
int u=q.front();q.pop();vis[u]=0;
for(int i=0;i<F[u].size();i++) {
int v=F[u][i];
if(dis2[v]<dis2[u]+siz[v]) {
dis2[v]=dis2[u]+siz[v];
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
}
int main() {
#ifdef HSZ
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
n=rd(),m=rd();
int u,v;
fo(i,1,m) u=rd(),v=rd(),add(u,v);
fo(i,1,n) if(!dfn[i]) tarjan(i);
fo(i,1,n) {
go(j,i)
if(col[i]!=col[v]) G[col[i]].push_back(col[v]),F[col[v]].push_back(col[i]);
}
spfa1();
spfa2();
int ans=siz[col[1]];
fo(i,1,n) {
if(!vis[col[i]]&&dis1[col[i]]) {
vis[col[i]]=1;
fo(j,0,(int)F[col[i]].size()-1) {//???
int v=F[col[i]][j];
if(dis2[v]==0) continue;
ans=max(ans,dis1[col[i]]+dis2[v]-siz[col[1]]);
}
}
}
cout<<ans<<endl;
return 0;
}
[USACO15JAN]Grass Cownoisseur的更多相关文章
- P3119 [USACO15JAN]Grass Cownoisseur G
P3119 [USACO15JAN]Grass Cownoisseur G tarjan缩点+分层图上跑 spfa最长路 约翰有 \(n\) 块草场,编号 \(1\) 到 \(n\),这些草场由若干条 ...
- 解题:USACO15JAN Grass Cownoisseur
解题 首先缩点没啥可说的,然后考虑枚举这次逆行的边.具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑 ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...
- 洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)
[USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- 【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur
草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...
- [补档][Usaco2015 Jan]Grass Cownoisseur
[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 ...
随机推荐
- 依赖注入【转自知乎 PHP】
第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒…… 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 <img src="https://pic1 ...
- centos7 tengine2.1.2 编译安装 防火墙设置
安装 pcre 和 openssl yum -y install pcre pcre-devel yum -y install openssl openssl-devel wget http://te ...
- Java 过滤器、监听器、拦截器的区别
原文:http://www.360doc.com/content/10/0601/09/495229_30616324.shtml 1.过滤器 Servlet中的过滤器Filter是实现了ja ...
- confusion_matrix函数的使用
from:http://blog.csdn.net/m0_38061927/article/details/77198990 官方文档中给出的用法是 sklearn.metrics.confusion ...
- ViewControl的size设为freeform
freeform的用处是让你写一些不标准的view,比如说自定义一个cell,或者自己写一个小的VIEW,freeform的XIB是可以自己拖拽更改大小的
- 使用Java实现图像分割
为减少动画制作过程中的IO操作,我们可以使用连续动画来改善动画播放效率.如果我们对图像中的每张小图像单独分割成独立的文件,那么当每次要使用这些小图像的时候,我们都得从文件中读取图像信息. 实际上我们可 ...
- bzoj 1627: [Usaco2007 Dec]穿越泥地【bfs】
在洛谷上被卡了一个点开了O2才过= = bfs即可,为方便存储,把所有坐标+500 #include<iostream> #include<cstdio> #include&l ...
- Linux学习之02_Linuxd的文件权限与目录配置
这里一些基本介绍就不介绍了,还是来介绍一下相关的命令 这一节重要的命令有这些: chgrp chown chmod 1.改变文件属性和权限 chgrp----改变文件所属用户组 chown----改变 ...
- Hexo 添加Live2D看板娘
title: Hexo 添加 Live2D看板娘 二次元什么的最喜欢了[大好きです] 准备 项目地址 live2d模型 部分模型预览 开始 首先进入Hexo博客根目录安装live2d插件 $ npm ...
- hadoop2.x 常用端口及定义方法
一 常用端口号 1 HDFS 2 YARN 3 HBase 4 Hive 5 ZooKeeper 二 Web UIHTTP服务 1 对于存在 Web UIHTTP服务的所有 hadoop daemon ...