首页 > 其他分享 >SP14887 GOODA - Good Travels 题解

SP14887 GOODA - Good Travels 题解

时间:2024-07-14 11:30:15浏览次数:16  
标签:1000010 cnt 题解 ll st Travels GOODA low dis

题目传送门

前置知识

Tarjan 算法 | 最短路

解法

缩点后原图就成为了一个有向无环图,此时每个点最多被经过一次,故在求最长路的过程中可以将点权和边权混着转移。

  • 上篇题解用拓扑实现查找两点间最长路的做法正确性不会证,遂写了份 Dijkstra 求最长路。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct node
{
	ll nxt,to;
}e[1000010];
stack<ll>s;
ll head[1000010],dfn[1000010],low[1000010],ins[1000010],c[1000010],a[1000010],b[1000010],u[1000010],v[1000010],vis[1000010],dis[1000010],cnt=0,tot=0,ans=0;
void add(ll u,ll v)
{
	cnt++;
	e[cnt].nxt=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}
void tarjan(ll x)
{
	ll k=0,i;
	tot++;
	dfn[x]=low[x]=tot;
	ins[x]=1;
	s.push(x);
	for(i=head[x];i!=0;i=e[i].nxt)
	{
		if(dfn[e[i].to]==0)
		{
			tarjan(e[i].to);
			low[x]=min(low[x],low[e[i].to]);
		}
		else
		{
			if(ins[e[i].to]==1)
			{
				low[x]=min(low[x],dfn[e[i].to]);
			}
		}
	}
	if(dfn[x]==low[x])
	{
		ans++;
		while(x!=k)
		{
			k=s.top();
			ins[k]=0;
			c[k]=ans;
			b[ans]+=a[k];
			s.pop();
		}
	}
}
void dijkstra(ll st)
{
	ll x,i;
	memset(vis,0,sizeof(vis));
	memset(dis,-0x3f,sizeof(dis));
	priority_queue<pair<ll,ll> >q;
	dis[st]=b[st];
	q.push(make_pair(dis[st],st));
	while(q.empty()==0)
	{
		x=q.top().second;
		q.pop();
		if(vis[x]==0)
		{
			vis[x]=1;
			for(i=head[x];i!=0;i=e[i].nxt)
			{
				if(dis[e[i].to]<dis[x]+b[e[i].to])
				{
					dis[e[i].to]=dis[x]+b[e[i].to];
					q.push(make_pair(dis[e[i].to],e[i].to));
				}
			}
		}
	}
}
int main()
{
	ll n,m,st,ed,i;
	cin>>n>>m>>st>>ed;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(i=1;i<=m;i++)
	{
		cin>>u[i]>>v[i];
		add(u[i],v[i]);
	}
	for(i=1;i<=n;i++)
	{
		if(dfn[i]==0)
		{
			tarjan(i);
		}
	}
	cnt=0;
	memset(e,0,sizeof(e));
	memset(head,0,sizeof(head));
	for(i=1;i<=m;i++)
	{
		if(c[u[i]]!=c[v[i]])
		{
			add(c[u[i]],c[v[i]]);
		}
	}
	dijkstra(c[st]);
	cout<<dis[c[ed]]<<endl;
	return 0;
}

标签:1000010,cnt,题解,ll,st,Travels,GOODA,low,dis
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18301280

相关文章

  • 【反悔贪心】P2949WorkSchedulingG+P4053[JSOI2007]建筑抢修题解
    这两天遇到了几个很神奇的题目——能反悔的贪心。赶紧记录一下。例1(用时一定模型)用时一定:每个任务完成的耗时都是一样的。题面:Luogu-P2949WorkSchedulingG大体思路是:先把所有任务按照截止时间从小到大排序,然后枚举,遇到一个能做任务的就把他做了,把他的贡献加入一个......
  • 题解:AT_abc362_c [ABC362C] Sum = 0
    很好写(15min解决)但不好讲(跟别人讲了20min)的写法QwQ……首先,咱先算出原式的范围。最小值(暂且记为\(k\))的公式就是:\[k=\sum_{i=1}^{N}L_i\]就是每一个最小可能值的和。同理,最大值(我记为\(w\))的公式就是:\[w=\sum_{i=1}^{N}R_i\]即最大可能值的和。算这玩意儿......
  • 【题解】洛谷 P10765 「CROI · R2」在相思树下 I
    I题意简述共\(T\)组测试数据。对于每一组测试数据,有初始数列,共\(n\)个元素,从\(1\)至\(n\)。给出\(k\)次操作。操作一:将数列中下标为奇数的数全部删除;操作二:将数列中下标为偶数的数全部删除。完成操作之后,将剩余的数从下标\(1\)开始依次重新编排下标。求问\(k\)次......
  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • 洛谷 P6522 [CEOI2010 day2] tower 题解
    [CEOI2010day2]tower题目背景古巴比伦人决定建造一座塔。题目描述这座塔共有\(n\)层,每层由一个边长为\(a_i\)的立方体石块构成。一个石块\(i\)能够直接放在石块\(j\)上当且仅当\(a_i\leqa_j+D\),其中\(D\)为一个给定的常数。你需要求出如果使用全部的石块,有多......
  • 洛谷 P2478 [SDOI2010] 城市规划 题解
    题意简述仙人掌上求至少间隔两个位置的最大独立集。(仙人掌指,没有一条边在两个或以上的环里的无向图。)题目分析仙人掌就是树套环,即树上每个结点都是一个结点或环。那么将题目拆解成树上DP和环上DP即可。用tarjan缩点即可。树上DP先来看看树上DP。显然每个点有三个状......
  • [ZJOI2006] 三色二叉树 题解
    [ZJOI2006]三色二叉树题解link趣题。首先我们把题目分成两部分:建树和dp求解。建树:观察发现,字符串中的第\(i\)个字符就代表图中的第\(i\)个节点。如果\(S_i=0\),直接跳过;如果\(S_i=1\),那么\(i+1\)是\(i\)唯一的子节点,在两点之间连边,然后继续递归建树即可。......
  • 2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有()种。A.1B.2C.3D.4答案:C第2......
  • Codeforces Round 957 (Div. 3) A-G 题解
    CodeforcesRound957(Div.3)A-G题解A.OnlyPluses枚举思路:枚举\(a\),\(b\),\(c\)增加的次数,维护最值即可。代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#......
  • 初等数论课程测试题解
    初等数论课程测试题解刚想起来传到博客园上面。正在写。Upd.20240222:已写完,欢迎查错!一、请给出整除的概念及性质对于整数\(a,b\)\((b\neq0)\),如果存在整数\(c\),使得\(a=bc\),则称\(b\)整除\(a\),记作\(b\mida\);否则称\(b\)不整除\(a\),记作\(b\nmida\)。性质......