【题目链接】:

pid=5418">click here~~

【题目大意】:

问题描写叙述
经过多年的努力,Victor最终考到了飞行驾照。

为了庆祝这件事,他决定给自己买一架飞机然后环游世界。

他会驾驶一架飞机沿着规定的航线飞行。在地球上一共同拥有nn个国家,编号从11到nn。各个国家之间通过mm条双向航线连接,第ii条航线连接第u_iu​i​​个国家与第v_iv​i​​个国家,通过这条航线须要消耗w_iw​i​​升油。且从11号国家能够直接或间接到达22到nn中随意一个国家。

Victor一開始位于11号国家。他想知道从11号国家出发,经过各个国家至少一次并最后回到11号国家消耗的总油量的最小值是多少。
输入描写叙述
第一行包括一个整数TT,表示測试数据的组数。

每组測试数据的第一行有两个整数nn和mm,表示国家的个数和航线的条数。

接下来mm行。每行三个整数u_iu​i​​, v_iv​i​​, w_iw​i​​,描写叙述一条航线。

1\leq T\leq 201≤T≤20。

1\leq n\leq 161≤n≤16。

1\leq m\leq 1000001≤m≤100000。

1\leq w_i\leq 1001≤w​i​​≤100。

1\leq u_i, v_i \leq n1≤u​i​​,v​i​​≤n。
输出描写叙述
每组測试数据输出一行一个整数,即消耗的总油量的最小值。
输入例子
1
3 2
1 2 2
1 3 3
输出例子
10

【思路】:

我们首先须要预处理出随意两个国家之间的最短距离。由于数据范围非常小,所以直接用Floyd即可了。

之后,我们用f[S][i]表示訪问国家的情况为S,当前最后訪问的一个国家是i所须要的最小总油量,当中,S的二进制表示记录了訪问国家的情况,S在二进制表示下的第i位(无论是从左往右还是从右往左都能够)假设是1则表示第i个国家被訪问过了,否则表示第i个国家没有被訪问过。那么f[S|(1<<i)][i]=min(f[S][j]+mat[i][j])(mat[i][j]:表示城市i,j的最短路径)。当中i和j满足S&(1<<j)=1且S&(1<<i)=0。

最開始时,除了f[1][1]是0,其它情况都是无穷大,之后先枚举S,再枚举i,那么终于的答案就是min(f[(1<<n)-1][i]+f[i][1]),当中i\in∈[2,n]。总复杂度为O(n^3+n^2*2^n)O(n​3​​+n​2​​∗2​n​​)。

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <fstream>
#include <cstring>
#include <climits>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <list>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <functional>
#include <algorithm> using namespace std; #define rep(i,j,k) for(int i=(int)j;i<(int)k;++i)
#define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a)) const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int N=1e5+100;
const double eps = 1e-15;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int, int> pir; int mat[100][100];
int dp[(1<<16)+10][20]; int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
int movv[5][2]= {{1,0},{0,1},{0,0},{-1,0},{0,-1}}; inline LL read()
{
int c=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
return c*f;
}
int main(){
int t;t=read();
while (t--){
mem(dp,inf);mem(mat,inf);
int u, v, w, n, m;
n=read();m=read();
for(int i = 1; i <= m; ++i){
u=read();v=read();w=read();--u;--v;
mat[u][v] = Min(mat[u][v], w);
mat[v][u] = Min(mat[v][u], w);
}
for (int i = 0; i < n; ++i){
mat[i][i] = 0;
}
for (int k = 0; k < n; ++k){// floyd
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
mat[i][j] = Min(mat[i][j], mat[i][k] + mat[k][j]);
}
}
}
dp[0][0] = 0;
for (int i = 0; i < (1 << n); ++i){
for (int j = 0; j < n; ++j){
if (dp[i][j] != inf){
for (int k = 0; k < n; ++k){
dp[i | (1 << k)][k] = Min(dp[i | (1 << k)][k], dp[i][j] + mat[j][k]);
}
}
}
}
printf("%d\n", dp[(1 << n) - 1][0]);
}
return 0;
} /*
1
3 2
1 2 2
1 3 3
*/

BestCoder Round #52 (div.2) HDU 5418 Victor and World (DP+状态压缩)的更多相关文章

  1. HDU 5418——Victor and World——————【状态压缩+floyd】

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

  2. HDU 5418 Victor and World (状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意:有n个结点m条边(有边权)组成的一张连通图(n <16, m<100000 ...

  3. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  4. TSP+Floyd BestCoder Round #52 (div.2) 1002 Victor and Machine

    题目传送门 题意:有中文版的 分析:(出题人的解题报告)我们首先需要预处理出任意两个国家之间的最短距离,因为数据范围很小,所以直接用Floyd就行了.之后,我们用f[S][i]表示访问国家的情况为S, ...

  5. 构造 BestCoder Round #52 (div.2) 1001 Victor and Machine

    题目传送门 题意:有中文版的 分析:首先要知道机器关闭后,w是清零的.所以一次(x + y)的循环弹出的小球个数是固定的,为x / w + 1,那么在边界时讨论一下就行了 收获:这种题目不难,理解清楚 ...

  6. BestCoder Round #52 (div.1)

    这周六BC和CF又差点打架,精力不够啊...结果打BC没起来,就看了一眼题跑了...今天早上补补吧,(因为今天晚上还要打UER= =) 先放官方题解: 1000 Victor and Machine ...

  7. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  8. hdu 4336 Card Collector(期望 dp 状态压缩)

    Problem Description In your childhood, people in the famous novel Water Margin, you will win an amaz ...

  9. HDU 1074 Doing Homework(DP状态压缩)

    题意:有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名字典序最 ...

随机推荐

  1. Libevent学习笔记

    学习: /Users/baidu/Documents/Data/Interview/服务器-检索端/libevent参考手册(中文版).pdf 讲的不好.翻译的..

  2. 【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查

    (1)效果 (2)源码与资源下载 http://pan.baidu.com/s/1pJLo2PP (3)总结 --核心是利用UITableView里面自带的cell来制作样式同样的cell. 与之对应 ...

  3. Methods Collection of Enumerating Com Port in Windows, by C

    According to this stack overflow thread, PJ Naughter has implemented 9 methods to emunerate com port ...

  4. hdu(2846)Repository

    Problem Description When you go shopping, you can search in repository for avalible merchandises by ...

  5. 积跬步,聚小流------java信息生成图片

    需求: 是在做证书的时候碰到的这个问题. 当时需求是能够进行在线打印证书,第一次进行的操作是直接打印html,并且已经排好版(用jqprint插件)进行打印.在打印时碰到了兼容的问题,另外因为背景图片 ...

  6. DB-MySQL:MySQL GROUP BY

    ylbtech-DB-MySQL:MySQL GROUP BY 1.返回顶部 1. MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使 ...

  7. React 父组件触发子组件事件

    Parent组件 import React from "react"; import Child from "./component/Child"; class ...

  8. SpringCloud微服务Docker部署

    前两写了两篇,都是为SpringCloud+Docker部署做准备,在部署的时候,不同服务器,不同的Docker容器之间的通信,还好没有掉到坑里去,在公司里用了新技术,还是很开心的,小有成就感,之前一 ...

  9. 3. Longest Substring Without Repeating Character[M] 最大不重复子串

    题目 Given a string, find the length of the longest substring without repeating characters. Example 1: ...

  10. 项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)

    总结项目用到的一些处理方法,用来解决数据处理的一些实际问题,所有方法都可以放在一个公共工具方法里面,实现不限ES5,ES6还有些Vue处理的方法. 都是项目中来的,有代码跟图片展示,长期更新. 1.获 ...