Tarjan水题系列(1):草鉴定Grass Cownoisseur [USACO15JAN]or[luogu P3119]
题目如下:
约翰有n块草场,编号1到n,这些草场由若干条单行道相连。奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草。
贝西总是从1号草场出发,最后回到1号草场。她想经过尽可能多的草场,贝西在通一个草场只吃一次草,所以一个草场可以经过多次。因为草场是单行道连接,这给贝西的品鉴工作带来了很大的不便,贝西想偷偷逆向行走一次,但最多只能有一次逆行。问,贝西最多能吃到多少个草场的牧草。
大意:
求一个有向图在走一次反向边或不走的情况下走的节点数最多的回到起点的路径的节点数
思路:
首先边可以重复走 所以缩点不会影响答案
缩点后得到的是一个DAG 我们有走一次反向边的机会 此时就相当于在DAG上加一条边 由于要从起点回到起点 这加的一条边的两端要满足一端起点能够到达 一端能通往起点
说到这里算法已经显而易见了 故不赘述了
下面是代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <memory.h>
#define r(x) x=read()
#define MAXX 100005
#define MIN(a,b) (a<b?a:b)
#define MAX(a,b) (a>b?a:b)
using namespace std;
int h[MAXX],h2[MAXX],cnt,dis[][MAXX],flag[MAXX];
int dfn[MAXX],low[MAXX],id[MAXX],w[MAXX],k,top,sta[MAXX],num;
int n,m,ans,ans2,u,to,st;
struct edge{int to,nex;}e[MAXX],yuan[MAXX];
void add(int u,int to)
{
cnt++;
e[cnt]=(edge){to,h[u]},h[u]=cnt;
}
void tarjan(int now)
{
sta[++top]=now;
dfn[now]=low[now]=++k;
for(int i=h[now];i;i=e[i].nex)
{
if(!dfn[e[i].to])
tarjan(e[i].to),low[now]=MIN(low[now],low[e[i].to]);
else
if(!id[e[i].to])
low[now]=MIN(low[now],dfn[e[i].to]);
}
if(low[now]==dfn[now])
{
id[now]=++num;
while(sta[top]!=now){id[sta[top]]=num;top--;}
top--;
}
}
void spfa(int now,int x)
{
queue<int>que;
dis[x][now]=w[now];
que.push(now);
flag[now]=;
while(!que.empty())
{
int p=que.front();que.pop();
for(int i=h[p];i;i=e[i].nex)
{
if(i%!=x) continue;
if(dis[x][e[i].to]<dis[x][p]+w[e[i].to])
{
dis[x][e[i].to]=dis[x][p]+w[e[i].to];
if(!flag[e[i].to])
flag[e[i].to]=,que.push(e[i].to);
}
}
flag[p]=;
}
}
void dfs(int now)
{
for(int i=h[now];i;i=e[i].nex)
{
int to=e[i].to;
if(i%==)
{
if(dis[][now]&&dis[][to])
ans=MAX(ans,dis[][now]+dis[][to]);
}
else
dfs(to);
}
}
bool cmp(edge a,edge b)
{
return id[a.to]==id[b.to]?id[a.nex]<id[b.nex]:id[a.to]<id[b.to];
}
int read()
{
char ch=;int w=;
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){w=w*+ch-'';ch=getchar();}
return w;
}
int main()
{
r(n),r(m);
for(int i=;i<=m;++i)
r(u),r(to),add(u,to),yuan[i]=(edge){to,u};
for(int i=;i<=n;++i)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n;++i)
w[id[i]]++;
st=id[];
sort(yuan+,yuan+m+,cmp);
memset(h,,sizeof(h));
cnt=;
for(int i=;i<=m;++i)
{
int x=id[yuan[i].nex],y=id[yuan[i].to];
if((x==id[yuan[i-].nex]&&y==id[yuan[i-].to])||(x==y))
continue;
add(x,y),add(y,x);
}
spfa(st,),spfa(st,);
ans=w[st];
dfs(st);
if(ans>w[st]) printf("%d",ans-w[st]);
else printf("%d",ans);
return ;
}
Tarjan水题系列(1):草鉴定Grass Cownoisseur [USACO15JAN]or[luogu P3119]的更多相关文章
- [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)
[USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...
- 洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...
- 【洛谷P3119】[USACO15JAN]草鉴定Grass Cownoisseur
草鉴定Grass Cownoisseur 题目链接 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后 ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]
题目 大意: 缩点后转为求最长链的长度和最长链的个数 思路: 看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题 代码: 如下 #include <cstdio> ...
- [USACO15JAN]草鉴定Grass Cownoisseur (分层图,最长路,$Tarjan$)
题目链接 Solution 水水的套路题. 可以考虑到一个环内的点是可以都到达的,所以 \(tajan\) 求出一个 \(DAG\) . 然后 \(DAG\) 上的点权值就是 \(scc\) 的大小. ...
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- Tarjan水题系列(3):HNOI2006 潘多拉的魔盒
题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...
随机推荐
- 计时器 GC垃圾回收 demo
计时器: public void start() { //定义计时器 Timer timer=new Timer(); //定义运行间隔(数字越小,速度越快) int interval=30; //创 ...
- Spring Boot 的各种start
新建一个springBoot项目时,你会选择很多依赖,在项目中的build.gradle中你会看见各种start,例如下边的代码: 今天就在这里列举一下各种start: 1.spring-boot-s ...
- 虚拟机使用桥接模式连接网络并且设置静态ip
1.桥接模式连接网络 虚拟机连接网络一共有四种模式,我这里只介绍桥接模式,毕竟坑了我几个小时 设置有线连接,我本来用的无线连接完成微信点餐系统,后来换了有线因为有线连接不会分配ip,和本地电脑使用同一 ...
- Lucene实践:全文检索的基本原理
一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: "Apache Lucene(TM) is a high-performan ...
- CF Round #576 (Div. 2) Matching vs Independent Set
链接:Click here 题目意思:给你一个图,有3n个点,m条边,求是否有n条匹配边或n个独立点,其中匹配为没有公共点,独立为不相连 Solution: 考虑每个点对于第一种情况,最多只能贡献一次 ...
- BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)
线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...
- JS中集合对象(Array、Map、Set)及类数组对象的使用与对比(转载)
在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型. ES6引入了iterable类型,Array ...
- CDH安装时,部分节点不受管控
解决方案: /opt/cm-5.12.0/etc/init.d/cloudera-scm-agent stop cd /opt/cm-5.12.0/lib/cloudera-scm-agent/ rm ...
- 20175308 2018-2019-2 实验四 《Android开发基础》实验报告
20175308 2018-2019-2 实验四 <Android开发基础>实验报告 实验要求 参考 Android开发简易教程 完成云班课中的检查点,也可以先完成实验报告,直接提交.注意 ...
- HTTP请求方式之POST和GET的区别
GET请求方式: 如果我们的网页收集到的用户数据,他规定了,此网页用户数据用GET的请求方式去处理的话,我们会发现,比如百度,就是一个很经典的GET请求方式 当我们在百度搜索上输入一个‘java’,点 ...