「CodeVS」 2800 送外賣
阿新 • • 發佈:2018-09-09
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 送外賣