BestCoder Round #52 (div.2) HDU 5418 Victor and World (DP+状态压缩)
【题目链接】: pid=5418">click here~~
【题目大意】:
经过多年的努力,Victor最终考到了飞行驾照。 为了庆祝这件事,他决定给自己买一架飞机然后环游世界。 他会驾驶一架飞机沿着规定的航线飞行。在地球上一共同拥有nn个国家,编号从11到nn。各个国家之间通过mm条双向航线连接,第ii条航线连接第u_iui个国家与第v_ivi个国家,通过这条航线须要消耗w_iwi升油。且从11号国家能够直接或间接到达22到nn中随意一个国家。 Victor一開始位于11号国家。他想知道从11号国家出发,经过各个国家至少一次并最后回到11号国家消耗的总油量的最小值是多少。
第一行包括一个整数TT,表示測试数据的组数。 每组測试数据的第一行有两个整数nn和mm,表示国家的个数和航线的条数。 接下来mm行。每行三个整数u_iui, v_ivi, w_iwi,描写叙述一条航线。 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≤wi≤100。 1\leq u_i, v_i \leq n1≤ui,vi≤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(n3+n2∗2n)。
代码:
#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+状态压缩)的更多相关文章
- HDU 5418——Victor and World——————【状态压缩+floyd】
Victor and World Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Other ...
- HDU 5418 Victor and World (状态压缩dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意:有n个结点m条边(有边权)组成的一张连通图(n <16, m<100000 ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- TSP+Floyd BestCoder Round #52 (div.2) 1002 Victor and Machine
题目传送门 题意:有中文版的 分析:(出题人的解题报告)我们首先需要预处理出任意两个国家之间的最短距离,因为数据范围很小,所以直接用Floyd就行了.之后,我们用f[S][i]表示访问国家的情况为S, ...
- 构造 BestCoder Round #52 (div.2) 1001 Victor and Machine
题目传送门 题意:有中文版的 分析:首先要知道机器关闭后,w是清零的.所以一次(x + y)的循环弹出的小球个数是固定的,为x / w + 1,那么在边界时讨论一下就行了 收获:这种题目不难,理解清楚 ...
- BestCoder Round #52 (div.1)
这周六BC和CF又差点打架,精力不够啊...结果打BC没起来,就看了一眼题跑了...今天早上补补吧,(因为今天晚上还要打UER= =) 先放官方题解: 1000 Victor and Machine ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- hdu 4336 Card Collector(期望 dp 状态压缩)
Problem Description In your childhood, people in the famous novel Water Margin, you will win an amaz ...
- HDU 1074 Doing Homework(DP状态压缩)
题意:有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名字典序最 ...
随机推荐
- linux驱动之poll操作
POLL操作 1.POLL运行过程: poll是一个系统调用,其内核入口函数为sys_poll,sys_poll差点儿不做不论什么处理直接调用do_sys_poll,do_sys_poll的运行过程能 ...
- j-link修复 write flash 一直无法点击
write flash 一直无法点击 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTcyNDI5NTc=/font/5a6L5L2T/fonts ...
- web后台知识点整理
五.JEE 适用于创建server端的大型的软件服务系统 1. JEE : JAVA PLATFORM ENTERPRISE DEDITON 2.是一个规范集.技术集.框架集(API集) 一种技 ...
- java old GC和young GC
Java内存分配机制 摘自:http://www.cnblogs.com/zhguang/p/3257367.html 这里所说的内存分配,主要指的是在堆上的分配,一般的,对象的内存分配都是在堆上进行 ...
- Java悲观锁和乐观锁
悲观的并发策略——Synchronized互斥锁 互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁释放后才能重新进 ...
- Python使用functools模块中的partial函数生成偏函数
所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...
- SQL常用函数集锦
..STUFF()用另一子串替换字符串指定位置.长度的子串.STUFF (<character_expression1>, <start_ position>, <len ...
- Array.prototype.slice.call(arguments) 通俗法理解
Array.prototype.slice.call(arguments,num) 能将具有length属性的对象转成数组. slice 从字面上的意思可以理解为截取数组的一部分. call 从字 ...
- R 连接DB2数据库
1.odbc文件下载 教程: http://dasapp.oregon.gov/datamart/files/IBM_DB2_9.7_Run_Time_client_Notes.pdf 驱动地址: h ...
- ServiceStack.Redis之IRedisClient(转载)
一.属性 IRedisClient的属性如下: 属性 说明 ConnectTimeout 连接超时 Db 当前数据库的ID或下标 DbSize 当前数据库的 key 的数量 HadExceptio ...