floyd求两点最短距离
dfs枚举,也可以用next_permutation,相当于把这些点全排列求最值

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxx=2e5+10;
int a[1100],dis[110][110],p,vis[1100];
ll ans=maxx;
int n;
void dfs(int x,ll sum,int cnt){
	if(cnt==p){
		ans=min(ans,sum+dis[x][n]);
	
		return;
	}
	for(int i=0;i<p;i++){
		if(!vis[i]){
			vis[i]=1;
			dfs(a[i],sum+dis[x][a[i]],cnt+1);
			vis[i]=0;
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>dis[i][j];
		}
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
		   for(int j=1;j<=n;j++){
		   	    if(dis[i][j]>dis[i][k]+dis[k][j]&&(i!=j!=k)){
		   	    	dis[i][j]=dis[i][k]+dis[k][j];
				}
	    	}
		}
	}

	cin>>p;
	for(int i=0;i<p;i++) cin>>a[i];
	dfs(1,0,0);
	cout<<ans;
	return 0;
}


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐