HDU-3001 Travelling
生活随笔
收集整理的這篇文章主要介紹了
HDU-3001 Travelling
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:
http://acm.hdu.edu.cn/showproblem.php?pid=3001題意:
TSP問題,最多10個(gè)點(diǎn),給出之間的路線長度,求遍歷的最短總路徑長。
思路:
狀壓DP,注意是每個(gè)點(diǎn)不能拜訪超過兩次,所以是三進(jìn)制狀壓。
dp[i+pos[k]][k] = min(dp[i+pos[k]][k], dp[i][j]+g[j][k]);dp[i][j]表示在i狀態(tài)時(shí)當(dāng)前位置是j的最短路徑。
代碼:
#define N 11 #define M 112345int n,m; int g[N][N],pos[N]; int dp[M][N],vis[M][N]; void init() {int i,j,t;pos[0]=1;for(i=1;i<N;i++)pos[i] = pos[i-1]*3;for(i=0;i<=pos[N-1];i++)for(t=i,j=0;j<N;j++)vis[i][j]=t%3,t/=3; } int solve() {int ans=INF;for(int i=0;i<n;i++)dp[pos[i]][i] = 0;for(int i=0;i<pos[n];i++){int flag=1;for(int j=0;j<n;j++){if(vis[i][j]==0)flag=0;if(dp[i][j]==INF)continue;for(int k=0;k<n;k++)if(j!=k){if(vis[i][k]==2||g[j][k]==INF)continue;dp[i+pos[k]][k] = min(dp[i+pos[k]][k],dp[i][j]+g[j][k]);}}if(flag)for(int j=0;j<n;j++)ans=min(ans,dp[i][j]);}if(ans==INF)ans=-1;return ans; } int main() {int i,j,k,kk,t,x,y,z;init();while(scanf("%d%d",&n,&m)!=EOF&&n){memset(g,0x3f,sizeof(g));memset(dp,0x3f,sizeof(dp));for(i=0;i<m;i++){scanf("%d%d%d",&x,&y,&z);x--;y--;g[x][y]=g[y][x]=min(g[x][y],z);}printf("%d\n",solve());}return 0; }總結(jié)
以上是生活随笔為你收集整理的HDU-3001 Travelling的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机cpu寄存器 c语言,51单片机共
- 下一篇: hdu 3001 tsp问题/三进制