1. 程式人生 > >「CodeVS」 2800 送外賣

「CodeVS」 2800 送外賣

pan algorithm blank class clu digi 距離 codevs 最短

題意:原題在這

快遞小哥從city 0出發去(n+1)*(n+1)城市矩陣中送快遞,求來回最短時間

做法:

TSP問題,這裏選用dp做法

Floyd初始化城市間的距離;

令dp[1<<i][i]=dis[0][i]; 表示先走一格,好轉移

dp[s][j]表示走了j個城市,狀態為s時的最小時間

註意所有循環從0開始!從0開始!從0開始!調死人qwq

代碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include
<algorithm> #define inf 0x3ffff using namespace std; int n; int dis[20][20]; int dp[1<<20][20]; //1<<n即為pow(2,n)的位運算形式 int main() { cin>>n; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) { cin>>dis[i][j]; } //初始化 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]); } int digit=(1<<(n+1))-1; for(int s=0;s<(1<<17);s++) for(int i=0;i<17;i++) { dp[s][i]=inf; } for(int i=1;i<=n+1;i++) { dp[
1<<i][i]=dis[0][i];//先走一格,好轉移 } for(int s=0;s<=digit;s++) for(int i=0;i<=n;i++) { if((s|(1<<i))!=s) continue; for(int j=0;j<=n;j++) { //if(i==j) continue; dp[s|(1<<j)][j]=min(dp[s][i]+dis[i][j],dp[s|(1<<j)][j]); } } cout<<dp[digit][0]<<endl; return 0; }

「CodeVS」 2800 送外賣