\(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的更多相关文章

  1. P3119 [USACO15JAN]Grass Cownoisseur G

    P3119 [USACO15JAN]Grass Cownoisseur G tarjan缩点+分层图上跑 spfa最长路 约翰有 \(n\) 块草场,编号 \(1\) 到 \(n\),这些草场由若干条 ...

  2. 解题:USACO15JAN Grass Cownoisseur

    解题 首先缩点没啥可说的,然后考虑枚举这次逆行的边.具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑 ...

  3. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...

  4. 洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...

  5. [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)

    [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...

  6. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...

  7. 【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur

    草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...

  8. [补档][Usaco2015 Jan]Grass Cownoisseur

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

  9. BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*

    BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...

随机推荐

  1. go语言---传值和传引用

    go语言---传值和传引用 https://blog.csdn.net/cyk2396/article/details/78893828 1.定义: b = a; b.modify(); 如果b的修改 ...

  2. window安装Elasticsearch

    下载,https://www.elastic.co/cn/downloads/elasticsearch 下载后解压,进入解压目录,运行./elasticsearch.bat 运行成功如下 (运行需要 ...

  3. poj2154 Color ——Polya定理

    题目:http://poj.org/problem?id=2154 今天学了个高端的东西,Polya定理... 此题就是模板,然而还是写了好久好久... 具体看这个博客吧:https://blog.c ...

  4. 逻辑频道号---DVB NIT LCN

    先介绍NIT,NIT描述如下: 有一点要注意,NIT是对大网的描述,即NIT并不是描述当前的流,而是描述大网的某些或者全部流.如下图,TS流描述1-6共对6个频点不同的TS流进行了描述,具体对哪一个流 ...

  5. Python基础 — Pandas

    Pandas -- 简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.        Pandas ...

  6. robotframework - 测试用例&套件- Settings标签

    1.Test Case -- Settings标签截图 2.Test Case Settings 标签说明: Documentation:用于描述用例的一个小文本,它可以把 URL 地址转换为可点击的 ...

  7. php做APP接口开发,接口的安全性

    1.当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在session(或者保存在redis)中,将生成的ac ...

  8. ACM_01背包

    背包1 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量不超过 W ...

  9. 转:python中使用txt文本保存和读取变量

    问题: 在python中需要经常有需要提前生成复杂的计算结果变量的需求减少程序计算运行时间的需求,因此这里把变量存在txt文本文件中. 解决方法: 使用两个函数解决问题,一个函数把变量保存到文本文件中 ...

  10. STL容器迭代过程中删除元素技巧(转)

    1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素. vector<in ...