题目链接

题意

给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次)。

思路

状态表示、转移及大体思路poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp 相同。

但,因为是每个点 至多可以经过两次,所以应该用 三进制 来表示状态。

因为三进制不能直接通过移位来表示,所以要 预处理 出每个数字\(state\)的三进制表示中每一位\(i\)上的值\(dig[state][i]\).

注意:该题数据中有 重边

Code

#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define inf 0x3f3f3f3f
#define maxs 60010
#define maxn 12
using namespace std;
typedef long long LL;
int power3[] = {1, 3, 9,27,81,243,729,2187,6561,19683,59049};
int n, m, dp[maxs][maxn], dig[maxs][maxn], dis[maxn][maxn];
bool vis[maxs][maxn];
void init() {
F(i, 0, power3[n]) {
int state = i, cnt = 0;
while (state) {
dig[i][cnt++] = state%3;
state /= 3;
}
}
}
int dfs(int state, int p) {
if (state == power3[p]) return 0;
if (vis[state][p]) return dp[state][p];
vis[state][p] = true;
int sta = state - power3[p], ans = inf;
F(i, 0, n) {
if (dis[i][p] && dig[state][i] && (i!=p || (i==p&&dig[state][i]==2))) ans = min(ans, dfs(sta, i)+dis[i][p]);
}
return dp[state][p] = ans;
}
inline bool check(int state) {
F(i, 0, n) if (!dig[state][i]) return false;
return true;
}
void work() {
memset(dp, 0, sizeof dp); memset(vis, 0, sizeof vis); memset(dis, 0, sizeof dis);
init();
F(i, 0, m) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w); --u, --v;
if (dis[u][v]==0 || w<dis[u][v]) dis[u][v] = dis[v][u] = w;
}
int lim = power3[n]-1, ans = inf;
F2(i, lim>>1, lim) {
if (!check(i)) continue;
F(j, 0, n) {
ans = min(ans, dfs(i, j));
}
}
printf("%d\n", ans==inf?-1:ans);
}
int main() {
while (scanf("%d%d", &n,&m) != EOF) work();
return 0;
}

最新文章

  1. c语言实现牛顿迭代法
  2. 条件运算符(?:)和 $&quot;&quot;替代string.Format()
  3. button 边框
  4. C语言程序代写
  5. PM【terminal】
  6. d010: 分离自然数
  7. 把一个select查询结果插入到一个表(可选指定字段和值实例)
  8. 我的Android进阶之旅------&gt;Android服务的生命周期回调方法
  9. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
  10. Asterisk 未来之路3.0_0006
  11. UICollectionView基本使用详解(OC)
  12. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)
  13. xcode更换启动图显示空白launchImg
  14. linux系统下部署DNS反向解析
  15. 万物互联之~RPC专栏
  16. Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用
  17. poj-2689-素数区间筛
  18. grep console
  19. Tslib触摸屏官网【转】
  20. openssl编译出错解决

热门文章

  1. 一、Linux 安装
  2. 制定RPM包和加入YUM源
  3. 自动化运维工具——ansible命令使用(二)
  4. 排序算法合集(Java)
  5. Spark MLlib(下)--机器学习库SparkMLlib实战
  6. RSA进阶之维纳攻击(wiener-attack )
  7. EXCEL合并单元格快捷键暨WORD+EXCEL自定义快捷键
  8. 使用jQuery ui创建模态表单
  9. python 中输入一个字符串,判断这个字符串中有多少个字符、数字、空格、特殊字符
  10. MFC编程入门之二十八(常用控件:列表视图控件List Control上)