题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/734698752d360d33b39bea3662cf36e9.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/64ede340a636f6574fb63a790b76a8c8.png)
class Solution {
public:
struct Edge{int to,len,nex;}*edge;int *head,tot=0;
void add(int from,int to,int len){
edge[++tot]=(Edge){to,len,head[from]},head[from]=tot;
edge[++tot]=(Edge){from,len,head[to]},head[to]=tot;
}
#define INF 0x3f3f3f3f
typedef pair<int,int> pi;
priority_queue<pi,vector<pi>,greater<pi> >q;int* d;
void dijkstra(int s){
q.push({0,s}),d[s]=0;
while(!q.empty()){
int x=q.top().second;q.pop();
for(int i=head[x];i;i=edge[i].nex){
int y=edge[i].to,l=edge[i].len;
if(d[y]>max(d[x],l)) d[y]=max(d[x],l),q.push({d[y],y});
}
}
}
int minimumEffortPath(vector<vector<int>>& a) {
int n=a.size(),m=a[0].size();
head=new int[n*m],edge=new Edge[n*m*4],d=new int[n*m];
for(int i=0;i<n*m;++i) head[i]=0;
for(int i=0;i<n*m*4;++i) edge[i].nex=0;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(i<n-1) add(i*m+j,i*m+j+m,abs(a[i][j]-a[i+1][j]));
if(j<m-1) add(i*m+j,i*m+j+1,abs(a[i][j]-a[i][j+1]));
d[i*m+j]=INF;
}
}
dijkstra(0);
return d[n*m-1];
}
};