IPUOJ24101旅行商问题(状压dp)

痞子三分冷 提交于 2019-11-30 16:47:53

 

题目↓(建议全屏看图)

 

常规状压,集合思想;挺简单的  具体看代码吧

#include<bits/stdc++.h>
using namespace std;
#define fr(g,h)  for(int g = 0; g < h; g++)
const int N = 25, M = 2100000;
int n,nn,mm,a[N][N],f[N][M];
inline void init ()
{
    scanf("%d",&n);
    fr(i,n)
      fr(j,n)
       cin >> a[i][j];
    memset(f, 0x3f, sizeof f);
}

void floyd()
{
    fr(k,n)
     fr(i,n)
      fr(j,n) 
       a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
}

void dp()
{
  for(int s = 1; s <= (1 << n) - 1; s++)  //从第一个开始走过 (这个地方s的优化还是蛮重要的,暴力开210万只能险过)
   fr(i,n)
    fr(j,n)
     if(s & (1 << j)) 
     f[i][s|(1<<i)] = min(f[i][s|(1<<i)], f[j][s] + a[i][j]);
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
int main()
{
  init();
  f[0][1] = 0;
  floyd();
  dp();
  cout << f[0][(1<<n) - 1];
  return 0;    
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!