P3119 [USACO15JAN]Grass Cownoisseur G(tarjan+dp)

news/2025/2/24 14:28:09

LINK

先缩点,在 D A G DAG DAG上跑最长路可以得到 d i s [ v ] dis[v] dis[v]

表示 1 1 1号点的联通分量到 v v v连通分量最多走多少草坪

当走到 u u u点时使用反向机会走到点 v v v,其中 v v v一定是能到达点 1 1 1所属的连通分量的

所以以 1 1 1所在联通分量为起点,终点分别跑一次最长路

然后枚举那个中转点计算答案即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
const int inf = 1e9;
struct edge{
	int u,to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){ d[++cnt] = ( edge ){u,v,head[u]},head[u] = cnt; }
int n,m,low[maxn],dfn[maxn],id,scc,stac[maxn],top,vis[maxn],sd[maxn],num[maxn];
void tarjan(int u)
{
	low[u] = dfn[u] = ++id; vis[u] = 1; stac[++top] = u;
	for(int i=head[u];i;i=d[i].nxt )
	{
		int v = d[i].to;
		if( !dfn[v] )
		{
			tarjan(v);
			low[u] = min( low[u],low[v] );
		}
		else if( vis[v] )	low[u] = min( low[u],low[v] );
	}
	if( dfn[u]==low[u] )
	{
		int temp; scc++;
		while( temp = stac[top--] )
		{
			sd[temp] = scc; num[scc]++; vis[temp] = 0;
			if( temp==u )	break;
		}
	}
}
vector<int>vec1[maxn],vec2[maxn];
int dis1[maxn],dis2[maxn];
void spfa(int s,int dis[],vector<int>vec[] )
{
	queue<int>q;
	for(int i=1;i<=scc;i++)		dis[i] = -inf, vis[i] = 0;
	q.push( s ); dis[s] = num[s]; vis[s] = 1;
	while( !q.empty() )
	{
		int u = q.front(); q.pop();
		vis[u] = 0;
		for(auto v:vec[u] )
		{
			if( dis[u]+num[v]>dis[v] )
			{
				dis[v] = dis[u]+num[v];
				if( !vis[v] )	q.push( v ), vis[v] = 1;
			}
		}
	}
}
int main()
{
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		int l,r; cin >> l >> r;
		add(l,r);
	}
	for(int i=1;i<=n;i++)	if( !dfn[i] )	tarjan(i);
	for(int i=2;i<=cnt;i++)
	{
		int u = d[i].u, v = d[i].to;
		if( sd[u]!=sd[v] )
		{
			vec1[sd[u]].push_back( sd[v] );
			vec2[sd[v]].push_back( sd[u] );
		}
	}
	spfa( sd[1],dis1,vec1 ); spfa( sd[1],dis2,vec2 );
	int ans = num[sd[1]];
	for(int i=1;i<=n;i++)
	{
		int u = sd[i];
		for(auto v:vec2[u] )
			ans = max( ans,dis1[u]+dis2[v]-num[sd[1]] );
	}
	cout << ans;
}

http://www.niftyadmin.cn/n/3620847.html

相关文章

训练总结 18.7.18 暑假训练第三天

今日完成题量两道。 两道题&#xff0c;一道线段树&#xff0c;一道网络流。线段树那道题有点迷&#xff0c;RE了好几次&#xff0c;线段树一直都应用不大熟练。网络流今天刚补的知识点&#xff0c;勉强看懂&#xff0c;应用相当不熟练&#xff0c;今天的题目最大流最短路&…

CodeSmith 二、多模板按目录树批量自动生成代码

通过调用指定目录下的所有模板&#xff0c;逐一按照数据表生成独立的代码文件。支持多模板调用、支持所有数据表生成或批量指定多个生成、支持自动的文件目录结构、支持代码文件格式化命名等。 背景&#xff1a;最近一个新项目一高兴选了Mysql 8&#xff0…

康威定律-软件之道:软件开发争议问题剖析

每个架构师都应该研究下康威定律 http://36kr.com/p/5042735.html 软件之道:软件开发争议问题剖析((美)AndyOram) http://baike.baidu.com/view/11495670.htm

斯坦福机器学习视频笔记 Week4 Week5 神经网络 Neural Networks

神经网络是一种受大脑工作原理启发的模式。 它在许多应用中广泛使用&#xff1a;当您的手机解释并理解您的语音命令时&#xff0c;很可能是神经网络正在帮助理解您的语音; 当您兑现支票时&#xff0c;自动读取数字的机器也使用神经网络。 Non-linear Classification 当输入数据…

如何利用几何画板解方程

解方程的方法不止一种&#xff0c;可以用正常方法解&#xff0c;也可以用公式法或一些较好的计算器&#xff0c;但是这两种方法都比较繁琐&#xff0c;下面介绍如何利用几何画板解方程的方法。 具体的操作步骤如下&#xff1a; 步骤一 新建一个网格。打开几何画板软件&#xff…

P5058 [ZJOI2004]嗅探器(割点的理解)

LINK 答案必定是某个割点,但是割点并不一定是答案 移除割点后,原图被分成若干个部分,如何判断a,ba,ba,b在不同的连通块?? 我们知道,我们认定uuu是割点是因为存在 dfn[u]<low[v]dfn[u]<low[v]dfn[u]<low[v] 此时vvv的子树无法回到更浅的节点,割掉uuu,将与其他部分…

训练总结 18.7.19 暑假训练第四天

今天上午新开的专题做了三道题&#xff0c;是之前做过的题。之前把思路理清了做起来还是比较顺利。 下午的比赛&#xff0c;虽然之前有心理准备&#xff0c;但做起来还是怪难受的。签个到都难&#xff0c;最后那道题目&#xff0c;一开始想着预处理一下&#xff0c;然后直接查询…

Flask, Tornado, GEvent组合运行与性能比较

我在选一个python的互联网框架, 本来已经定下来用Tornado了. 但我还听到很多人推荐Flask的简单性和灵活性, 还有gevent的高性能, 所以决定也试试它们以及它们和Tornado的结合. 我的示例就比”Hello World”应用稍微复杂一点儿, 它用到了模板. 下面是代码: 1, 纯粹Flask (pur…