POJ 3311 floyd + 프레스 DP

2231 단어
poj3311은 이 문제점 N이 10을 넘지 않기 때문에 상태를 2진수로 바꿀 수 있다. 0은 이 점을 통과하지 않았음을 나타내고 1은 이 점을 통과했다는 것을 나타낸다.dp[i][j]는 i 상태에서 j에 도착하는 가장 짧은 경로를 나타낸다



#include
#include
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;idp[i][j]+mapp[j][k])))
                       {
                           //         k       i    j        
                          dp[i|(1<

hdu5418문제는 이전 문제와 약간 다르다. 나는 이전 코드에서 고쳤다.그래서 하표를 모두 1로 깎았다.
#include
#include
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;iv)
          {
              mapp[a][b]=v;
              mapp[b][a]=v;
          }
      }
       for(int k=0;kmapp[i][k]+mapp[k][j]))
                       {
                             mapp[i][j]=mapp[i][k]+mapp[k][j];
                       }
                   }
               }
           }
       }
       dp[1][0]=0;
       for(int i=1;idp[i][j]+mapp[j][k])))
                       {
                           //         k       i    j        
                          dp[i|(1<

좋은 웹페이지 즐겨찾기