P3119 [USACO15JAN]草鉴定Grass Cownoisseur 缩点 topo或最长路
题意: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或最长路相关推荐
- 洛谷 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
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur
https://www.luogu.org/problem/show?pid=3119 本来我是来练习tarjan的,结果tarjan部分直接copy了,反而拓扑排序部分想了好久: 这道题SZB大神两 ...
- [USACO15JAN]草鉴定Grass Cownoisseur
tarjan缩点+最短路 这道题我想了一半的正解,就是缩点+DAG上考虑,之后图只有一种情况:1号点连着大量的点,大量的点连着1号点,部分能到达1号点的点连接着1号点能到达的部分点.转向就是要从1号点 ...
- 【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)
题干: After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends s ...
- 解题:USACO15JAN Grass Cownoisseur
解题 首先缩点没啥可说的,然后考虑枚举这次逆行的边.具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑 ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- 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 ...
- hdu 4612 边连通度缩点+树的最长路径
思路:将以桥为分界的所有连通分支进行缩点,得到一颗树,求出树的直径.再用树上的点减去直径,再减一 #pragma comment(linker, "/STACK:1024000000,102 ...
最新文章
- SpringMVC 学习笔记(五) 基于RESTful的CRUD
- 【FTP】FTP 命令模式下 PASV OR PORT
- kali 解决Metasploit拿到shell后显示中文乱码问题
- 借助Redis完成延时任务
- 【学神】1-4 用户及用户组管理
- stm32按键输入实验c语言,stm32f103学习笔记(三)按键输入(IO口输入)
- hMailServer 邮件系统安装配置篇
- python 保存图片代码_最简单的selenium+Python自动右键保存图片
- 网红品牌,都是“营销狗”?
- nodejs,python,sublime和Eclipse的包管理器 1
- GL_TEXTURE_WRAP系列参数的取值
- python中的snip用法_mac版截图软件Snip详细使用教程及常见问题
- 微量样本RNA甲基化m6A技术比较
- 静态网页制作(html+css)、css浮动,练习(网页布局),清除浮动
- linux磁盘所有格式化命令,Linux磁盘格式化命令的详细说明
- html怎么画正方形的斜线,html – 斜线的样式
- lol网通区服务器的位置,LOL英雄联盟转区系统地址在哪?
- 目前云计算的优势,主要有哪些?
- PCI、CPCI、CPCIE 区别、特点
- 计算机仿真的原理是相似性原理,计算机仿真中相似性原理的应用.doc