题意:n个点 m条有向边,可以来回走一个点,问在可以逆行一次的情况下最多有能经过多少个不同的点。

解: 先缩点去环建新图,新图建正序(表示以1为起点到达的点)和逆序(以1为终点到达的点) ,然后最长路求出从1到每个点经过不同点的最大数目 正向.f[i]和反向.f[i] ,最后枚举每一条边,计算ans和当前边两点最大值。 输出 ans - sum[belong[1]] ,因为这个重复了。其他细节见代码

#include <bits/stdc++.h>
using namespace std;
const int N = 300000;
const int inf = 0x7fffffff;
struct NN{int nxt,v;
}edge[N];
int n,m,num,cnt,head[N],ct;
int low[N],dfn[N],book[N],belong[N],sum[N];
void add(int x,int y){++ct;edge[ct].v = y;edge[ct].nxt = head[x];head[x] = ct;
}
stack<int> s;
struct topo{struct No{int v,nxt;}edge[N];int ct,in[N],head[N],vis[N];int f[N];void add(int x,int y){++ct;edge[ct].nxt = head[x];edge[ct].v = y;head[x] = ct;in[y]++;}void to_Sort(){queue<int> q;for(int i=1;i<=n;i++) f[i] = -inf;//把其他点都设置为负无穷 只有和1所在联通块相连才能更大 f[belong[1]] = sum[belong[1]];//初始化 防止走不通  f[i] 表示到第 i 块联通分量的最大数目 for(int i=1;i<=n;i++){if(!in[i])q.push(i);}while(!q.empty()){int v = q.front();    q.pop();    vis[v] = 1;for(int i=head[v];i;i=edge[i].nxt){f[edge[i].v] = max(f[edge[i].v],f[v]+sum[edge[i].v]);in[edge[i].v]--;if(!in[edge[i].v]&&!vis[edge[i].v])q.push(edge[i].v),vis[edge[i].v] = 0;}}}
}pos,neg;
void tarjan(int u){dfn[u] = low[u] = ++num;s.push(u); book[u]=1;for(int v,i=head[u];i;i=edge[i].nxt){v = edge[i].v;if(!dfn[v]){tarjan(v);low[u] = min(low[u],low[v]);}else if(book[v])low[u] = min(low[u],dfn[v]);}if(dfn[u]==low[u]){int v;++cnt;do{v = s.top();s.pop();book[v] = 0;belong[v] = cnt;sum[cnt]++;}while(u!=v);}
}
int main()
{scanf("%d %d",&n,&m);for(int i=1;i<=m;i++){int u,v;scanf("%d %d",&u,&v);add(u,v);}for(int i=1;i<=n;i++)if(!dfn[i]){tarjan(i);}   for(int i=1;i<=n;i++){for(int v,j=head[i];j;j=edge[j].nxt){v = edge[j].v;if(belong[i]!=belong[v]){pos.add(belong[i],belong[v]);neg.add(belong[v],belong[i]);}}}pos.to_Sort();neg.to_Sort(); int ans = sum[belong[1]];//初始化为一个块个数 防止走不通  for(int i=1;i<=n;i++){for(int v,j=head[i];j;j=edge[j].nxt){v = edge[j].v;if(pos.f[belong[v]]>0&&neg.f[belong[i]]>0)//两点都必须到达 ans = max(ans,pos.f[belong[v]]+neg.f[belong[i]]);}   }printf("%d\n",ans-sum[belong[1]]);return 0;
}

P3119 [USACO15JAN]草鉴定Grass Cownoisseur 缩点 topo或最长路相关推荐

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

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

  2. P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...

  3. 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    https://www.luogu.org/problem/show?pid=3119 本来我是来练习tarjan的,结果tarjan部分直接copy了,反而拓扑排序部分想了好久: 这道题SZB大神两 ...

  4. [USACO15JAN]草鉴定Grass Cownoisseur

    tarjan缩点+最短路 这道题我想了一半的正解,就是缩点+DAG上考虑,之后图只有一种情况:1号点连着大量的点,大量的点连着1号点,部分能到达1号点的点连接着1号点能到达的部分点.转向就是要从1号点 ...

  5. 【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)

    题干: After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends s ...

  6. 解题:USACO15JAN Grass Cownoisseur

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

  7. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  8. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

  9. hdu 4612 边连通度缩点+树的最长路径

    思路:将以桥为分界的所有连通分支进行缩点,得到一颗树,求出树的直径.再用树上的点减去直径,再减一 #pragma comment(linker, "/STACK:1024000000,102 ...

最新文章

  1. SpringMVC 学习笔记(五) 基于RESTful的CRUD
  2. 【FTP】FTP 命令模式下 PASV OR PORT
  3. kali 解决Metasploit拿到shell后显示中文乱码问题
  4. 借助Redis完成延时任务
  5. 【学神】1-4 用户及用户组管理
  6. stm32按键输入实验c语言,stm32f103学习笔记(三)按键输入(IO口输入)
  7. hMailServer 邮件系统安装配置篇
  8. python 保存图片代码_最简单的selenium+Python自动右键保存图片
  9. 网红品牌,都是“营销狗”?
  10. nodejs,python,sublime和Eclipse的包管理器 1
  11. GL_TEXTURE_WRAP系列参数的取值
  12. python中的snip用法_mac版截图软件Snip详细使用教程及常见问题
  13. 微量样本RNA甲基化m6A技术比较
  14. 静态网页制作(html+css)、css浮动,练习(网页布局),清除浮动
  15. linux磁盘所有格式化命令,Linux磁盘格式化命令的详细说明
  16. html怎么画正方形的斜线,html – 斜线的样式
  17. lol网通区服务器的位置,LOL英雄联盟转区系统地址在哪?
  18. 目前云计算的优势,主要有哪些?
  19. PCI、CPCI、CPCIE 区别、特点
  20. 计算机仿真的原理是相似性原理,计算机仿真中相似性原理的应用.doc

热门文章

  1. 关于Handler二三事(下)
  2. Python画好看的星空图(唯美的背景)
  3. BigDecimal类型比较大小
  4. 用openCV实现形态学操作
  5. 公众号数据回采工具教您如何从零开始运营!
  6. 将低端文石电子书设备改造为电脑显示器的几次尝试
  7. 三大C2C购物网站淘宝拍拍有啊之横向评测【转载,好文章值得推荐】
  8. 网站微信扫码登录总结
  9. win7 开发相关 软件装机
  10. 安卓第三夜 概念漫游(上)