TSP变形(三进制状压)
2024-08-27 14:47:05
题目:HDU3001
#include <bits/stdc++.h>
using namespace std;
int state[],vis[][],dis[][];
int n,m,dp[][];
void init()//预处理三进制状态
{
state[]=;
for(int i=;i<=;i++) state[i]=state[i-]*;//最多10个点,要处理到11
for(int i=;i<=state[];i++)
{
int tmp=i;
for(int j=;j<=;j++){// 把10位都处理一下
vis[i][j]=tmp%;
tmp/=;
}
}
}
int main()
{
init();
while(cin>>n>>m)
{
memset(dp,,sizeof(dp));
memset(dis,,sizeof(dis));
int inf=dp[][];
for(int i=;i<=n;i++)
dp[state[i]][i]=;
for(int i=;i<=m;i++)
{
int l,r,w;
cin>>l>>r>>w;
dis[l][r]=dis[r][l]=min(dis[l][r],w);
}
int ans=inf;
for(int i=;i<state[n+];i++)//枚举状态
{
bool flag=;
for(int j=;j<=n;j++)//枚举状态的每一位
{
if(!vis[i][j]) flag=;//本状态没有达成目的
if(dp[i][j]==inf) continue;//没有前驱
for(int k=;k<=n;k++)//枚举下一个节点
{
if(vis[i][k]>=) continue;
if(dis[j][k]==inf) continue;//没有路
dp[i+state[k]][k]=min(dp[i+state[k]][k],dp[i][j]+dis[j][k]);
}
}
if(flag){
for(int j=;j<=n;j++) ans=min(ans,dp[i][j]);
}
}
if(ans==inf) cout<<-<<endl;
else cout<<ans<<endl;
}
}
最新文章
- C#设计模式-装饰者模式
- sed 字符串替换
- 给文本框添加模糊搜索功能(“我记录”MVC框架下实现)
- 【Android 进阶】临时卸载root和恢复root功能
- PHP 文件上传类
- Thread create 创建进程
- 用正则表达式获取所有img标签
- javascript体系 DOM原理
- U-BOOT配置过程
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
- Android 绘图工具库AChartEngine
- curl讲解第一篇---入门和基本使用
- 多线程工具类:CountDownLatch、CyclicBarrier、Semaphore、LockSupport
- 【emWin】例程十二:FontCvt生成字库
- Docker小白从零入门实战
- 配置HDFS HttpFS和WebHDFS
- javaScriptObject转String
- java多线程(一)之继承Thread类
- 部署Jar包到远程Maven仓库
- 01-maven环境配置