题意:变形tsp 必须搞成三进制

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a; i<=b; i++)
int n,m;
const int INF = 0x3f3f3f3f;
int g[15][15];
int dp[300000][11];
int status[20];
int getstatus()
{int res = 0;for(int i=n-1; i>=0; i--)res = res*3 + status[i];return res;
}
int power(int a, int b)
{int res = 1;while(b){if(b&1) res*=a;a*=a;b>>=1;}return res;
}
int to(int s)
{memset(status, 0, sizeof(status));int st = 0;while(s){status[st++] = s%3;s/=3;}
}
int p[15];
int main()
{p[0] = 1;for(int i=1; i<=11; i++) p[i] = 3*p[i-1];while(cin>>n>>m){memset(dp, INF, sizeof(dp));memset(g, INF, sizeof(g));for(int i=0; i<n; i++) g[i][i] = 0;rep(i, 1, m){int u,v,w;scanf("%d %d %d", &u, &v, &w);u--;v--;g[u][v] = min(g[u][v], w);g[v][u] = min(g[v][u], w);}for(int i=0; i<n; i++) dp[p[i]][i] = 0;for(int i=0; i<p[n]; i++){to(i);for(int j=0; j<n; j++){if(status[j] == 0) continue;status[j] --;int temp = getstatus();for(int k=0; k<n; k++)if(status[k] != 0&&k!=j)dp[i][j] = min(dp[i][j], dp[temp][k] + g[j][k]); status[j] ++;}}int res = INF;for(int s=1; s<p[n]; s++){bool flag = true;to(s);for(int i=0; i<n; i++) if(status[i] == 0) flag= false;if(flag){for(int i=0; i<n; i++)res = min(res, dp[s][i]);}}if(res == INF)cout<<-1<<endl;elsecout<<res<<endl;}return 0;
}

hdu 3001 tsp问题/三进制相关推荐

  1. hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)

    题目链接 题意: 给出一个模3意义下的矩阵,每次选中一个元素就可以使得自身+2,上下左右元素+1.求所有元素变成0的一种解. 思路: 这个题目高斯消元复杂度明明是O(n^3)的啊,这个题O((n*m) ...

  2. HDU 3001 三进制状压DP

    HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...

  3. HDU 3001 Travelling (三进制状压dp)

    题意 n(n<=10)n(n个城市,知道每个城市间的旅行费用,但每个城市最多走两遍.问最小花费是多少 . 也就是每个城市可以走两次的tsp问题. 分析 最多走两次,三进制0 1 2可满足,即用三 ...

  4. HDU3001 Traveling (状压dp+三进制+Tsp问题总结)

    (1)这道题最多可以走两次,所以有0, 1, 2三种状态,所以我们要用三进制 如果要用三进制,就要自己初始化两个数组, 一个是3的n次方,一个是三进制数的第几位的数字是什么 void init() { ...

  5. HDU 3001 Travelling

    http://acm.hdu.edu.cn/showproblem.php?pid=3001      题意:小明想去n个城市游玩,m条路,从一个城市到达另一个城市有一定的花费,每个城市最多可以走两次 ...

  6. hdu3001 Travelling 三进制状态压缩dp

    tsp类型,只是这里面的点最多可以访问2次. 所以用一个来表示访问了多少次,正好是三进制. 对于每个状态i,先处理出第j位为几,即num[i][j],方便使用. 用dp[i][j]表示,状态i时,以j ...

  7. [清华集训2016]石家庄的工人阶级队伍比较坚强——三进制FWT

    题目链接: [清华集训2016]石家庄的工人阶级队伍比较坚强 题目大意:有$n=3^m$个人玩石头剪刀布,共$t$轮游戏,每轮每个人要和包括自己的所有人各进行$m$次石头剪刀布.每个人在$m$轮中的决 ...

  8. hdu3001(三进制状压)

    题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...

  9. Travelling (三进制+状压dp)

    题目链接 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 inline ll rea ...

最新文章

  1. 聚类(Clustering)定义、聚类思想及形式、距离的度量
  2. 安卓桌面软件哪个好_简单好用的手机记事本软件哪个好?
  3. 配置纯净版Debian
  4. TZOJ 1321 Girls and Boys(匈牙利最大独立集)
  5. python通过api获取数据_在一次点击PythonRequests中从API获取所有数据
  6. python自动爬取更新电影网站_python爬取电影网站信息
  7. 华为回应美新规:不涉及产品买卖;微软 GitHub 帐户疑被黑;GCC 10.1 发布 | 极客头条...
  8. Linux配置java环境(超详细)
  9. JS数字正则表达式验证(全全全!!!)
  10. JAVA文章相似度对比(hanlp)
  11. 【信号用指数、正弦和余弦表示的原因】
  12. linux系统中的临时文件
  13. STM32小项目之ds18b20测温在oled上显示
  14. Vue和ElementUI第二天
  15. 电脑云便签怎么在桌面日历月视图上新增便签记录事情?
  16. 安卓手机如何更改开机 关机 动画
  17. 在网页上使用苹方字体
  18. 901.freeswitch常用命令
  19. 芒果超媒的2022年报:一半明媚,一半忧伤
  20. 香港个人银行开户会问什么问题,怎么回答?

热门文章

  1. 微信qq邮箱提醒 服务器繁忙,用qq邮箱找回微信密码为什么一直提示服务器繁忙???...
  2. ArcGIS中的投影、定义投影及动态投影
  3. 两款语音合成助手,微软语音合成
  4. 最新淘宝补单之补单计划,实现九天后入池,补单平台真实操作分享
  5. i312100f和i512400f哪个好 i312100f和i512400f差多少
  6. 浅谈 pipeline
  7. caj转pdf在线转换器免费,不限制页数。
  8. 如何开展网安XX行动防护工作
  9. 玩转Bootstrap(基础) (4.网格系统实现原理)
  10. 杭州安川焊接机器人_安川YASKAWA 焊接机器人MA1400