Luogu P11131 【MX-X5-T3】「GFOI Round 1」Cthugha 题解

P11131 【MX-X5-T3】「GFOI Round 1」Cthugha

有意思的最短路题目,需要对迪杰斯特拉算法有深入的理解。

首先,不存在最小值的条件是相邻的两个格子加起来值小于 0,此时在这两个格子之间反复横跳,就没有最小值。

观察到 q 很小,所以我们把网格建成一个图,对于每一个人跑一遍到每一个点的最短路,然后按照对于每一个点取所有人的最大值。统计答案是取最小值即可。

注意有负权边,而 SPFA 死了,所以考虑迪杰斯特拉。如果你对迪杰斯特拉有深入了解,直接把 SPFA 换成迪杰斯特拉,然后就过了。

因为迪杰斯特拉的正确性基于第一次取到这个点是就是最优答案,而在这个图中如果出去绕一下回来距离变小了,证明不存在最小值。如果存在最小值,绕回来之后一定距离变大,满足条件。

#include <bits/stdc++.h>
using namespace std;
struct edge
{
	long long v,nxt,d;
}e[2000000];
long long n,m,t,l,r,h[200000],a[200000],dis[200000],ans[200000],cnt=0;
bool vis[200000];
priority_queue<pair<long long,long long> >q;
void end()
{
	printf("No\n");
	exit(0);
}

long long has(long long x,long long y)
{
	return (x-1)*m+y;
}

void add_edge(long long u,long long v,long long d)
{
	e[++cnt].nxt=h[u];
	e[cnt].v=v;
	e[cnt].d=d;
	h[u]=cnt;
}

int main()
{
	scanf("%lld%lld%lld",&n,&m,&t);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++)
	        {
	    	scanf("%lld",&a[has(i,j)]);
	    	if(i!=1&&a[has(i,j)]+a[has(i-1,j)]<0)end();
	    	if(j!=1&&a[has(i,j)]+a[has(i,j-1)]<0)end();
	        }
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++)
	        {
	        if(i!=1)add_edge(has(i,j),has(i-1,j),a[has(i-1,j)]);
	        if(j!=1)add_edge(has(i,j),has(i,j-1),a[has(i,j-1)]);
	        if(i!=n)add_edge(has(i,j),has(i+1,j),a[has(i+1,j)]);
	        if(j!=m)add_edge(has(i,j),has(i,j+1),a[has(i,j+1)]);
			}
	for(int i=1;i<=n*m;i++)ans[i]=-1e18;
	for(int i=1;i<=t;i++)
	    {
	    scanf("%lld%lld",&l,&r);
	    for(int i=1;i<=n*m;i++)dis[i]=1e18,vis[i]=0;
	    dis[has(l,r)]=a[has(l,r)],q.push(make_pair(-dis[has(l,r)],has(l,r)));
	    while(!q.empty())
	       {
	       	long long x=q.top().second;
	       	q.pop();
	       	if(vis[x])continue;
	       	vis[x]=1;
	       	for(int i=h[x];i;i=e[i].nxt)
	       	    if(dis[e[i].v]>dis[x]+e[i].d)dis[e[i].v]=dis[x]+e[i].d,q.push(make_pair(-dis[e[i].v],e[i].v));
		   }
		for(int i=1;i<=n*m;i++)ans[i]=max(ans[i],dis[i]);
		}
	long long mi=1e18;
	for(int i=1;i<=n*m;i++)mi=min(mi,ans[i]);
	printf("%lld\n",mi);
	return 0;
}
posted @   w9095  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示