路线求调60分

image

我5月2日才旅游完,这几天看不到。

代码:

#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;
}    
1 个赞