首页 > 代码库 > poj 3311 tsp入门
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中已经过城市i13 {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 else19 {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 else39 {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 }
reference:
http://blog.csdn.net/chinaczy/article/details/5890768
poj 3311 tsp入门
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。