最长路板子求调qwq
查看原帖
最长路板子求调qwq
719978
DYYqwq楼主2023/6/17 17:02
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int to , nxt , w;
}e[400010];
struct edge
{
	int u , dis;
	bool operator < (const edge qwq) const
	{
		return dis > qwq.dis;
	}
};
priority_queue<edge> q;
int tot , head[400010] , h[200010] , dis[200010];
bool vis[200010];
int n , m;
void add(int u , int v , int w)
{
	++ tot;
	e[tot].to = v;
	e[tot].nxt = head[u];
	e[tot].w = w;
	head[u] = tot;
}
void dijk(int s)
{
	dis[s] = 0;
	q.push({s , dis[s]});
	while(!q.empty())
	{
		edge tmp = q.top();
		q.pop();
		int u = tmp.u;
		if(!vis[u]) continue;
		vis[u] = true;
		for(int i = head[u] ; i != 0 ; i = e[i].nxt)
		{
			int v = e[i].to;
			int w = e[i].w;
			if(dis[v] < dis[u] + w)
			{
				dis[v] = dis[u] + w;
				q.push({v , dis[v]});
			}
		}
	}
}
int main()
{
	scanf("%d%d" , &n , &m);
	for(int i = 1 ; i <= n ; i ++) scanf("%d" , &h[i]);
	for(int i = 1 ; i <= m ; i ++)
	{
		int u , v;
		scanf("%d%d" , &u , &v);
		add(u , v , (h[u] >= h[v]) ? 0 : (h[u] - h[v]));
		add(v , u , (h[v] >= h[u]) ? 0 : (h[v] - h[u]));
	}
	dijk(1);
	int ans = INT_MIN; 
	for(int i = 1 ; i <= n ; i ++) ans = max(ans , dis[i] + h[i] - h[1]);
	printf("%d" , ans);
	return 0;
}
2023/6/17 17:02
加载中...