hdu5418--Victor and World(floyd+状压dp)
题目链接:点击打开链接
题目大意:有n个城市。在n个城市之间有m条双向路。每条路有一个距离。如今问从1号城市去游览其他的2到n号城市最后回到1号城市的最短路径(保证1能够直接或间接到达2到n)。(n<=16)
首先用floyd跑出随意一点到其它点最短路。
从n小于等于16就能够看出用状压,从1点開始,dp[i][j]当前经过了i中为1的城市。最后经过的城市是j,不断维护。最后得到dp[1<<n-1][j]+dis[j][1]的距离最短的值。
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
#include <time.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
#pragma comment(linker, "/STACK:1024000000")
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-9 ;
int Map[20][20] ;
int dp[200000][20] , dis[20] ;
int main() {
int t , n , m ;
int i , j , w , k , min1 ;
scanf("%d", &t) ;
while( t-- ) {
scanf("%d %d", &n, &m) ;
memset(Map,INF,sizeof(Map)) ;
while( m-- ) {
scanf("%d %d %d", &i, &j, &w) ;
i-- ; j-- ;
if( Map[i][j] > w )
Map[i][j] = Map[j][i] = w ;
}
for(i = 0 ; i < n ; i++) Map[i][i] = 0 ;
for(k = 0 ; k < n ; k++) {
for(i = 0 ; i < n ; i++) {
for(j = 0 ; j < n ; j++) {
Map[i][j] = min(Map[i][j],Map[i][k]+Map[k][j]) ;
}
}
}
memset(dp,INF,sizeof(dp)) ;
memset(dis,INF,sizeof(dis)) ;
dp[1][0] = 0 ;
dis[0] = 0 ;
m = 1<<n ;
for(i = 1 ; i < m ; i++) {
for(j = 0 ; j < n ; j++) {
if( dp[i][j] == INF ) continue ;
for(k = 0 ; k < n ; k++) {
if( (i&(1<<k)) || Map[j][k] == INF ) continue ;
if( dp[ i|(1<<k) ][k] > dp[i][j]+Map[j][k] ) {
dp[ i|(1<<k) ][k] = dp[i][j]+Map[j][k] ;
dis[k] = min(dis[k],dp[ i|(1<<k) ][k]) ;
}
}
}
}
min1 = INF ;
for(i = 0 ; i < n ; i++) {
min1 = min(min1,dp[m-1][i]+dis[i]) ;
}
printf("%d\n", min1) ;
}
return 0 ;
}
hdu5418--Victor and World(floyd+状压dp)的更多相关文章
- [hdu5418 Victor and World]floyd + 状压DP 或 SPFA
题意:给n个点,m条边,每次只能沿边走,花费为边权值,求从1出发经过所有其它点≥1次最后回到1的最小花费. 思路: 状压DP.先用Floyd得到任意两点间的最短距离,转移时沿两个点的最短路转移.此时的 ...
- HDU5418.Victor and World(状压DP)
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #i ...
- 【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp
题目描述 一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留.有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻 ...
- Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)
题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...
- poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
题目链接 题意 给定一个\(N\)个点的完全图(有向图),求从原点出发,经过所有点再回到原点的最短路径长度(可重复经过中途点). 思路 因为可多次经过同一个点,所以可用floyd先预处理出每两个点之间 ...
- codevs2800送外卖(floyd+状压dp)
2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东 ...
- HDU - 4284 Travel(floyd+状压dp)
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...
- ACM学习历程—HDU5418 Victor and World(动态规划 && 状压)
这个题目由于只有16个城市,很容易想到去用状压来保存状态. p[i][state]表示到i城市经过state状态的城市的最优值(state的二进制位每一位为1表示经过了该城市,否则没经过) 这样p[j ...
- POJ 3311 Hie with the Pie floyd+状压DP
链接:http://poj.org/problem?id=3311 题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多 ...
随机推荐
- express的学习,与使用
最近在学习vue的一个实战项目,碰到一个express,当时很萌,就随便看了看................ expres是基于node 的一个web框架, 首先可以找到它的官网照着学习 这里只讲一 ...
- java中volatile的简单理解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...
- Python之函数返回多个值
#!/usr/bin/env python26 #-*- coding:utf-8-*- def test(): a = 10 b = 20 return a,b #返回一个元组 atuple= te ...
- 2017/10/10 jar包错误
Description Resource Path Location Type Archive for required library: 'WebContent/WEB-IN ...
- 程序、计算机程序、java初论
一.程序? 程序一词来自生活,通常指完成某些事情的一种既定方式和过程,可以将程序看成对一系列动作的执行过程的描述. 例如:个人去银行取钱 1.带上存折/银行卡去银行 2.取号排队 3.将存折或储蓄卡递 ...
- jq 时间计算
-(function($){ var caculation = function(gap){ var minutes = 1000 * 60 var hours = minutes * 60 var ...
- Python 面向对象(四) 反射及其魔术方法
反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default]) 返回object对象 ...
- Oracle漏洞分析(tns_auth_sesskey)
p216 Oracle漏洞分析: 开启oracle: C:\oracle\product\\db_1\BIN\sqlplus.exe /nolog conn sys/mima1234 as sysdb ...
- jq获取被选中的option的值。jq获取被选中的单选按钮radio的值。
温故而知新,一起复习下jq的知识点. (1) jq获取被选中的option的值 <select id="select_id"> <option value=&qu ...
- Python中的单例模式
在 Python 中,我们可以用多种方法来实现单例模式: 使用模块 使用 __new__ 使用装饰器(decorator) 使用元类(metaclass) # mysingleton.py class ...