比赛时候过的人很少,感觉应该是都被卡题了没有读这个题,或者榜歪了?
题意:就是说给了一个n * m的矩阵,对于位置(i,j)的能量为x_(i-1)*m+j
起点在(ex,ey) 终点在(sx,sy) 当你从一个位置第一次走到另一个位置的时候,获得的值就是这两个格子能量相乘,每个点可以多次到达,不限制走的步数,就是说你可以随便走,但获得的值只能是第一次走到才有效计算。
思路:
要获得的值最大,又可以随便走,那最优策略就是把整个矩阵都走一遍··,然后出去就好了。
整个矩阵都走一遍,意味着整个矩阵联通。也就是把矩阵每个点都抽离出来当作图的一个点,意味着要求联通后的最大值。
那不就是最小生成树吗
首先把x_(i,j)处理出来,计算每个点与相邻之间四个点的权值,就是两点之间的能量相乘。然后跑一次克鲁斯卡尔求最大值即可。
对于边的处理,我们只需要处理当前点与他上边和左边的点即可,至于他与右边和下边的点,在遍历的时候也会算进去的,这样做可以保证不重不漏。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1505;
int p;
int x[maxn*maxn];
int v[maxn][maxn];
struct node
{
int x,y;
int v;
}a[maxn*maxn];
int f[maxn*maxn];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
int t;scanf("%d",&t

本文解析了E.CaveEscape竞赛题目,介绍了如何通过构造最小生成树算法解决矩阵能量值最大化的难题。策略包括处理矩阵能量值、计算点与邻点权值及使用克鲁斯卡尔算法求解。
最低0.47元/天 解锁文章
563

被折叠的 条评论
为什么被折叠?



