【动态规划】状压dp:蓝桥2020补给(旅行商问题)_Floyd算法

 

【动态规划】状压dp:蓝桥2020补给(旅行商问题)_最短路径_02

问题可以转换为:

从0出发途径每个城市至少一次返回0求最短路径:

解法:动态规划(状压dp)+Floyd预处理最短路径(从一个城市到另一个城市走最短路即可,不需考虑途径什么城市)

【动态规划笔记】状压dp:旅行商问题_m0_52043808的博客

初始化路径:如果两个城市直接的距离大于D,设为INF

注意:不能用memset初始化double数组

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm> 
//?调试 
using namespace std;
const int INF=1e9;
int n,D;
struct site{
	int x,y;
}s[21];
double dist(site a,site b){
	return sqrt((a.x-b.x)*(a. x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dis[20][20];
double dp[1<<18][20];
void init_dis(){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(dist(s[i],s[j])<=D)
			dis[i][j]=dist(s[i],s[j]);
			else
			dis[i][j]=INF;
		}
	}
}
void Floyd(){
for(int k=0;k<n;k++){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){		
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
}
void out_dis(){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cout<<dis[i][j]<<" "; 
		}
		cout<<endl;
	}
} 
void out_dp(){
	for(int s=0;s<1<<n;s++){
		for(int i=0;i<n;i++){
			cout<<dp[s][i]<<" ";
		}
		cout<<endl;
	}
}
int main(){
	cin>>n>>D;
	for(int i=0;i<n;i++){
		cin>>s[i].x>>s[i].y;
	}
	init_dis();
	Floyd();
	for(int s=0;s<(1<<n);s++){
		for(int i=0;i<n;i++){
			dp[s][i]=1e9;
		}
	}
	dp[1][0]=0;
	for(int s=0;s<(1<<n);s++){
		for(int i=0;i<n;i++){
			if(s&(1<<i)){
				for(int j=0;j<n;j++){
					if(i!=j&&(s&(1<<j))){
						dp[s][i]=min(dp[s][i],dp[s^1<<i][j]+dis[j][i]);
					}
				}
			}
		}
	}
	double res=INF;
	for(int i=1;i<n;i++){
		res=min(res,dp[(1<<n)-1][i]+dis[i][0]);
	}
	printf("%.2f",res);


}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.