POJ 3311 floyd+压状DP

作者: _弓长_大人 | 来源:发表于2017-09-02 15:46 被阅读38次

poj3311
因为这道题 点N 不超过10 可以 把状态转化 为 二进制数,0表示没经过这个点,1表示经过这个点。
dp[i][j] 表示的是 在 i 状态 下 到达j 的最短路径




#include<cstdio>
#include<cstring>
using namespace std;
int mapp[11][11];
int dp[1<<13][13];
int n;
int main()
{
   while(~scanf("%d",&n)&&n)
   {
      memset(mapp,0,sizeof(mapp));
      memset(dp,-1,sizeof(dp));
       for(int i=0;i<=n;i++)
       {
           for(int j=0;j<=n;j++)
           {
               scanf("%d",&mapp[i][j]);
           }
       }
       for(int k=0;k<=n;k++)
       {
           for(int i=0;i<=n;i++)
           {
               for(int j=0;j<=n;j++)
               {
                         if(mapp[i][j]>mapp[i][k]+mapp[k][j])
                         {
                              mapp[i][j]=mapp[i][k]+mapp[k][j];
                         }

               }
           }
       }
       dp[1][0]=0;
       for(int i=1;i<(1<<(n+1));i++)
       {
           i=i|1;
           for(int j=0;j<=n;j++)
           {   // 可以 这个状态可以 到达 j
               if(dp[i][j]!=-1)
               {
                   for(int k=0;k<=n;k++)
                   {
                       if(j!=k&&(dp[i|(1<<k)][k]==-1||(dp[i|(1<<k)][k]>dp[i][j]+mapp[j][k])))
                       {
                           // 这个状态 到达 k  为 状态 i 到达 j 的 最短路到达
                          dp[i|(1<<k)][k]=dp[i][j]+mapp[j][k];
                       }
                   }
               }
           }
       }
       printf("%d\n",dp[(1<<(n+1))-1][0]);
   }
    return 0;
}

hdu5418
题目跟上一题 略有不同,我是在之前的代码上改的。
所以下标都减一。

#include<cstdio>
#include<cstring>
using namespace std;
int mapp[18][18];
int dp[1<<18][18];
int n,m;
int a,b,v;
int main()
{  int t;
   scanf("%d",&t);
   while(t--)
   {
      scanf("%d%d",&n,&m);
      memset(mapp,-1,sizeof(mapp));
      memset(dp,-1,sizeof(dp));
      for(int i=0;i<m;i++)
      {
          scanf("%d%d%d",&a,&b,&v);
          a--;
          b--;
          int te=mapp[a][b];
          if(te==-1||te>v)
          {
              mapp[a][b]=v;
              mapp[b][a]=v;
          }
      }
       for(int k=0;k<n;k++)
       {
           for(int i=0;i<n;i++)
           {
               for(int j=0;j<n;j++)
               {
                   if(mapp[i][k]!=-1&&mapp[k][j]!=-1)
                   {
                       if(mapp[i][j]==-1||(mapp[i][j]>mapp[i][k]+mapp[k][j]))
                       {
                             mapp[i][j]=mapp[i][k]+mapp[k][j];
                       }
                   }
               }
           }
       }
       dp[1][0]=0;
       for(int i=1;i<(1<<(n));i++)
       {
           i=i|1;
           for(int j=0;j<n;j++)
           {   // 可以 这个状态可以 到达 j
               if(dp[i][j]!=-1)
               {
                   for(int k=0;k<n;k++)
                   {
                       if(j!=k&&(dp[i|(1<<k)][k]==-1||(dp[i|(1<<k)][k]>dp[i][j]+mapp[j][k])))
                       {
                           // 这个状态 到达 k  为 状态 i 到达 j 的 最短路到达
                          dp[i|(1<<k)][k]=dp[i][j]+mapp[j][k];
                       }
                   }
               }
           }
       }
       printf("%d\n",dp[(1<<(n))-1][0]);
   }
    return 0;
}

相关文章

  • POJ 3311 floyd+压状DP

    poj3311因为这道题 点N 不超过10 可以 把状态转化 为 二进制数,0表示没经过这个点,1表示经过这个点。...

  • 状压DP

    最短Hamilton路径 原题链接[https://www.acwing.com/activity/content...

  • DP训练——状压DP

    状压DP BZOJ1087题意在的棋盘里面放个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以...

  • 博弈论

    博弈DP POJ 1082: Calendar Game从最终状态向前dp即可。注意如下两点:1 需要保证前后的状...

  • 状压DP系列

    几点注意: 1.数组下标从1开始比较方便 zoj Easy 2048 Again保存状态的时候是保存下降子序列的情...

  • LeetCode 状压dp

    5639. 完成所有工作的最短时间[https://leetcode-cn.com/problems/find-m...

  • 状态压缩dp、轮廓线、插头dp——从入门到不会

    题目清单 POJ1185 炮兵布阵(状态压缩dp) HDU1693 闭合线路统计(插头dp) POJ2411 平面...

  • 动态规划

    基础DP POJ 3176: Cow Bowling数字三角形问题,DP方程不再赘述。代码如下 POJ 2229:...

  • 状态压缩和状压DP

    问题:n*n的棋盘放置n个点,保证每一行,每一列都有且只有一个点,有几种放置方式? 一、组合数解法:ans=n!二...

  • DP训练——背包DP

    背包DP POJ3093[http://poj.org/problem?id=3093]题意给定个物品和背包容量,...

网友评论

    本文标题:POJ 3311 floyd+压状DP

    本文链接:https://www.haomeiwen.com/subject/vtlrjxtx.html