【题目链接】:

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. APP为什么签名,使用keytool jarsigner进行签名

    签名(sign):在应用程序的特定字段写入特定的标记信息,表示该软件已经通过了签署者的审核.过程:使用私有密钥数字地签署一个给定的应用程序 作用: 识别应用程序作者 检測应用程序是否发生改变 有种程序 ...

  2. 全屏滚动实现:fullPage.js和fullPage

    fullPage.js和fullPage都能实现全屏滚动,二者差别是:fullPage.js需依赖于JQuery库,而fullPage不须要依赖不论什么一个js库.能够单独使用. 一.fullPage ...

  3. Unreal Engine 4 C++ 为编辑器中Actor创建自己定义图标

    有时候我们创建场景的时候,特定的Actor我们想给它一个特定的图标,便于观察.比方这样: 实现起来也非常easy.须要编写C++代码: 我们创建一个Actor,叫AMyActor.它包括一个Sprit ...

  4. 【POJ 3273】 Monthly Expense (二分)

    [POJ 3273] Monthly Expense (二分) 一个农民有块地 他列了个计划表 每天要花多少钱管理 但他想用m个月来管理 就想把这个计划表切割成m个月来完毕 想知道每一个月最少花费多少 ...

  5. Jmeter执行多条Mysql语句报错

    花了很长时间找原因,Jmeter一直返回的是MySql语法错误,就写了两条很简单的删除语句,并且在MySql里可以正常执行 包括换了jdbc驱动包,更改不同的Query Type等 后来发现两条语句拆 ...

  6. checkbox的使用总结

    1 checkbox如何选中时显示内容,不被选中时隐藏内容 <!DOCTYPE html> <html> <head> <meta name="vi ...

  7. 广播Intent的三种方式总结

    1.android有序广播和无序广播的区别 BroadcastReceiver所对应的广播分两类:普通广播和有序广播. 普通广播通过Context.sendBroadcast()方法来发送.它是完全异 ...

  8. 谈谈javascript中原型继承

    什么是继承?拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的 如何实现继承的方式 原型继承 混入继承 经典继承 1. 混入继承 由于一个对象可以继承自任意的对象,即:o可以继承自对象o ...

  9. nginx高级-前端必会

    需要设置的几个参数: 基本配置文件 user www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; ...

  10. Jmeter数据库测试

    Jmeter安装 Jmeter是纯java程序,所以在安装jmeter之前需要先安装JDK,并配置JDK路径,然后开始安装Jmeter. 进入Jmeter官网(https://jmeter.apach ...