有谁能帮忙一下呀?
60分代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=110;
vector<pair<int,int>> edge[100010];
int st[100010],dist[100010][N],ar[N][N],n,m,p;
int vis[20],kr[20];
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int maxn=-1e18,minn=1e18;
int tmp[100010];
void dfs(int k){
if(k==p+1){
int ans=0,last=1;
for(int i=1;i<=p;i++){
ans+=dist[last][tmp[kr[i]]];
last=tmp[kr[i]];
}
minn=min(minn,ans);
return;
}
for(int i=1;i<=p;i++){
if(vis[i]==0){
vis[i]=1;
kr[k]=i;
dfs(k+1);
vis[i]=0;
}
}
}
void dijkstra(int x){
for(int i=1;i<=n*m;i++) dist[x][i]=1e18;
memset(st,0,sizeof st);
st[x]=0;
dist[x][x]=0;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
q.push({0,x});
while(!q.empty()){
int a=q.top().second;q.pop();
if(st[a]) continue;
st[a]=1;
for(auto v:edge[a]) if(dist[x][a]+v.second<dist[x][v.first]){
dist[x][v.first]=dist[x][a]+v.second;
q.push({dist[x][v.first],v.first});
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>ar[i][j];
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
int x=(i-1)*m+j;
for(int k=0;k<4;k++){
int xx=i+dx[k],yy=j+dy[k];
if(1<=xx&&xx<=n&&1<=yy&&yy<=m){
int y=(xx-1)*m+yy;
edge[x].push_back({y,abs(ar[i][j]-ar[xx][yy])*abs(ar[i][j]-ar[xx][yy])+1});
}
}
}
cin>>p;
dijkstra(1);
for(int i=1;i<=p;i++){
int x,y;cin>>x>>y;
int z=(x-1)*m+y;
tmp[i]=z;
dijkstra(z);
}
dfs(1);
cout<<minn;
return 0;
}