题目大意:10个点的TSP问题,但是要求每个点最多走两边,不是只可以走一次,所以要用三进制的状态压缩解决这个问题。可以预处理每个状态的第k位是什么。

原代码链接:http://blog.csdn.net/accry/article/details/6607703

3进制,代表走过这个点的次数

#include <cstdio>
#include<cstdlib>
#include <cstring>
#define INF 0x1f1f1f1f
#define min(a,b) (a) < (b) ? (a) : (b)
using namespace std; int N,M;
int tri[12] = {0,1,3,9,27,81,243,729,2187,6561,19683,59049};
int dig[59050][11]; //dig[state][k_dig] 状态state的第k位是多少
int edge[11][11],dp[59050][11]; int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif // ONLINE_JUDGE //
// char stit[200];
// for (int i=0;i<12;i++)
// {
// itoa(tri[i],stit,3);
// puts(stit);
// } for(int i = 0; i < 59050; ++i)
{
int t = i;
for(int j = 1; j <= 10; ++j)
{
dig[i][j] = t%3;
t /= 3;
if(t == 0)break;
}
} // itoa(123,stit,3);
// puts(stit);
//
// puts("tst");
// for(int j = 1; j <= 10; ++j)
// printf("%d ",dig[123][j]); while(scanf("%d%d",&N,&M) != EOF)
{
memset(edge,INF,sizeof(edge)); int a,b,c;
int m2=M;
while(M --)
{
scanf("%d%d%d",&a,&b,&c);
if(c < edge[a][b])edge[a][b] = edge[b][a] = c;
} // for (int i=1;i<=N;i++)
// {
// for (int j=1;j<=N;j++)
// printf("%d ",edge[i][j]);
// puts("");
// } memset(dp,INF,sizeof(dp)); for(int i = 1; i <= N; ++i)dp[tri[i]][i] = 0; int ans = INF;
for(int S = 0; S < tri[N+1]; ++S)
{
int visit_all = 1;
for( int i = 1; i <= N; ++i)
{
if(dig[S][i] == 0)visit_all = 0;
if(dp[S][i] == INF)continue; for(int j = 1; j <= N; ++j)
{
if(i == j)continue;
if(edge[i][j] == INF ||dig[S][j] >= 2)continue;
int newS = S + tri[j];
dp[newS][j] =min(dp[newS][j],dp[S][i] + edge[i][j]);
}
} if(visit_all)
{
for(int j = 1; j <= N; ++j)
ans = min(ans,dp[S][j]);
} } if(ans == INF)
{
puts("-1");
continue;
}
printf("%d\n",ans);
}
return 0;
}

  

最新文章

  1. Minor【 PHP框架】4.服务容器与服务提供者
  2. 分部类(partial)
  3. xml中数据存储 &lt;![CDATA[ … ]]&gt;
  4. 在多线程环境中使用CoreData
  5. matlab 中的textscan
  6. C# 排序算法记录
  7. sql中文字符串获取拼音首字母
  8. 你必须知道的28个HTML5特征、窍门和技术
  9. 在网页中插入qq连接
  10. 在storyboard中的静态UITableView中拖入 UISearchBar and Search Display Controller出现的奇怪问题
  11. 【转】setAnimation和startAnimation区别
  12. QT中使用Glut库
  13. SSH2.0编程 ssh协议过程实现(转)
  14. iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置
  15. Beta版本展示
  16. 【学习】Linux Shell脚本编程
  17. Java 200+ 面试题补充② Netty 模块
  18. __x__(27)0907第四天__ float 浮动
  19. head first c初探网络编程上
  20. 关于Haclon使用GPU加速的代码实例

热门文章

  1. [HAOI2012]音量调节
  2. Java—面向对象—构造方法及相关思维导图
  3. HDU-5785 Interesting(Manacher算法+区间处理)
  4. linux概念之性能调优
  5. maxscript, 数组和字符串下标是从1开始的
  6. Tkinter单选框及滚动条
  7. css之border,dispaly
  8. 斐波那契(Fibonacci)数列的几种计算机解法
  9. 使用原生js写ajax
  10. Java自带工具jstack故障分析的一个案例