zoukankan      html  css  js  c++  java
  • poj 3311 tsp入门

    题意:n+1个点:0--n,找一条路径从0点出发遍历1--n的点再回到0,每个点可经过不止一次,求最短路径

    裸的TSP问题,先用Floyd求出各个点之间最短路,再状压dp即可

    用n+1位二进制表示状态

    附模板:

     1 //首先不难想到用FLOYD先求出任意2点的距离dis[i][j]
     2 //接着枚举所有状态,用11位二进制表示10个城市和pizza店,1表示经过,0表示没有经过
     3 //定义状态DP(S,i)表示在S状态下,到达城市I的最优值
     4 //接着状态转移方程:DP(S,i) = min{DP(S^(1<<i-1),k) + dis[k][j],DP(S,i)},器重S^(1<<i-1)表示未到达城市i的所有状态,1<=k<=n
     5 //对于全1的状态,即S = (1<<n)-1则表示经过所有城市的状态,最终还需要回到PIZZA店0
     6 //那么最终答案就是min{DP(S,i) + dis[i][0]}
     7 //dij[i][j]:i到j最短路
     8         
     9         for(int S = 0;S <= (1<<n)-1;++S)//枚举所有状态,用位运算表示
    10             for(int i = 1;i <= n;++i)
    11             {
    12                 if(S & (1<<(i-1)))//状态S中已经过城市i
    13                 {
    14                     if(S == (1<<(i-1)))    dp[S][i] = dis[0][i];//状态S只经过城市I,最优解自然是从0出发到i的dis,这也是DP的边界
    15                     else//如果S有经过多个城市
    16                     {
    17                         dp[S][i] = INF;
    18                         for(int j = 1;j <= n;++j)
    19                         {
    20                             if(S & (1<<(j-1)) && j != i)//枚举不是城市I的其他城市
    21                                 dp[S][i] = min(dp[S^(1<<(i-1))][j] + dis[j][i],dp[S][i]);
    22                             //在没经过城市I的状态中,寻找合适的中间点J使得距离更短,和FLOYD一样
    23                         }
    24                     }
    25                 }
    26             }
    27         ans = dp[(1<<n)-1][1] + dis[1][0];
    28         for(int i = 2;i <= n;++i)
    29             if(dp[(1<<n)-1][i] + dis[i][0] < ans)
    30                 ans = dp[(1<<n)-1][i] + dis[i][0];
    31         printf("%d/n",ans);

    Code:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 #define INF 1<<28;
     5 #define maxn 15
     6 
     7 int a[maxn][maxn];
     8 int dp[1<<maxn][maxn];
     9 int ans,S,n;
    10 
    11 int main()
    12 {
    13     ios::sync_with_stdio(false);
    14     while (cin>>n)
    15     {
    16         memset(a,0,sizeof(a));
    17         if (n==0)   break;
    18         else
    19         {
    20             for (int i=0;i<=n;i++)
    21                 for (int j=0;j<=n;j++)
    22                     cin>>a[i][j];
    23 
    24             for (int k=0;k<=n;k++)
    25                 for (int i=0;i<=n;i++)
    26                     for (int j=0;j<=n;j++)
    27                     {
    28                         if (a[i][k]+a[k][j]<a[i][j])
    29                             a[i][j]=a[i][k]+a[k][j];
    30                     }
    31 
    32             for (int S=0;S<=(1<<n)-1;S++)
    33                 for (int i=1;i<=n;i++)
    34                 {
    35                     if (S&(1<<(i-1)))
    36                     {
    37                         if (S==(1<<(i-1)))      dp[S][i]=a[0][i];
    38                         else
    39                         {
    40                             dp[S][i]=INF;
    41                             for (int j=1;j<=n;j++)
    42                             {
    43                                 if (S&(1<<(j-1))&&(j!=i))
    44                                     dp[S][i]=min(dp[S^(1<<(i-1))][j] + a[j][i],dp[S][i]);
    45                             }
    46                         }
    47                     }
    48                 }
    49 
    50             ans = dp[(1<<n)-1][1] + a[1][0];
    51             for(int i = 2;i <= n;i++)
    52                 if(dp[(1<<n)-1][i] + a[i][0] < ans)
    53                     ans = dp[(1<<n)-1][i] + a[i][0];
    54 
    55             cout<<ans<<endl;
    56         }
    57     }
    58 
    59 
    60 
    61 
    62 
    63     return 0;
    64 }
    View Code

    reference:

    http://blog.csdn.net/chinaczy/article/details/5890768

  • 相关阅读:
    微内核与宏内核
    操作系统内核
    What and where are the stack and heap?
    Memory : Stack vs Heap
    Android图形显示系统
    Android图形显示系统——上层显示1:界面绘制大纲---android的GUI系统
    二手设备进出口流程
    android binder 收藏文献
    binder的会话链接与通信
    深入分析AndroidBinder机制(远程对象访问)
  • 原文地址:https://www.cnblogs.com/pdev/p/4035015.html
Copyright © 2011-2022 走看看