P1690 贪婪的Copy Floyd+DFS
·
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;
}
更多推荐



所有评论(0)