题目链接:
思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP过程了。
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 222 8 #define inf 1<<30 9 10 struct Point{ 11 int x,y; 12 }point[MAXN]; 13 14 int value[MAXN][MAXN];//原图 15 int map[MAXN][MAXN];//宝藏间的最短距离 16 int dist[MAXN][MAXN];//宝藏到边界的距离 17 int dd[MAXN];//宝藏到达边界的最短距离 18 bool mark[MAXN][MAXN]; 19 int dp[1<<14][14]; 20 int n,m,k; 21 int dir[4][2]={ {-1,0},{ 1,0},{ 0,-1},{ 0,1}}; 22 23 void spfa(int num) 24 { 25 memset(mark,false,sizeof(mark)); 26 for(int i=0;i >que; 29 que.push(make_pair(point[num].x,point[num].y)); 30 if(dist[point[num].x][point[num].y]==-1)return; 31 dist[point[num].x][point[num].y]=0; 32 while(!que.empty()){ 33 int x=que.front().first,y=que.front().second; 34 que.pop(); 35 mark[x][y]=false; 36 if(x==0||x==(n-1)||y==0||y==(m-1)){ 37 dd[num]=min(dd[num],dist[x][y]); 38 } 39 for(int i=0;i<4;i++){ 40 int xx=x+dir[i][0],yy=y+dir[i][1]; 41 if(xx>=0&&xx =0&&yy