ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩
HDU 5418 Victor and World
Time Limit:2000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64u
countries on the earth, which are numbered from
to
. They are connected by
undirected flights, detailedly the
-th flight connects the 
-th and the 
-th country, and it will cost Victor's airplane 
L fuel if Victor flies through it. And it is possible for him to fly to every country from the first country.
Victor now is at the country whose number is
, he wants to know the minimal amount of fuel for him to visit every country at least once and finally return to the first country.
Input
, denoting the number of test cases. In every test case, there are two integers
and
in the first line, denoting the number of the countries and the number of the flights.
Then there are
lines, each line contains three integers 
, 
and 
, describing a flight.





.





.









.







.








.
Output
lines : the
-th of these should contain a single integer, denoting the minimal amount of fuel for Victor to finish the travel.Sample Input
1
3 2
1 2 2
1 3 3
Sample Output
10
/*/
一开始题目没读仔细,以为是一个最小树,秒WA一发;
后来想半天发现这个有环,就不是最小树了,搜了一下是Floyd+dp状压。 写完之后一直发现输出的是INF=0x3f3f3f3f ,找了半天最后想到二进制标记状态这里,maps标记用0 0开始会舒服好多。改过来就对了。题目很有意思。。 AC代码:
/*/
#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"string"
#include"cstdio"
#include"vector"
#include"cmath"
#include"queue"
using namespace std;
typedef long long LL;
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define MX 401
#define INF 0x3f3f3f3f int maps[20][20];
int dp[200000][20],vis[20]; void init() { memset(maps,0x3f);
memset(vis,0x3f);
memset(dp ,0x3f);
} int main() {
int T;
scanf("%d",&T);
while(T--) {
init();
int n,m,u,v,w;
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++) {
scanf("%d%d%d",&u,&v,&w);
if(maps[--u][--v] > w) //状态压缩从0开始会好写一些
maps[v][u]=maps[u][v]= w;
}
for(int i=0; i<n; i++)maps[i][i]=0; //标记自己到自己距离为0 //后面会要加到这个数字。。
for(int k=0; k<n; k++) {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]); //Floyd 把去某一点的最小路程计算出来
}
}
}
dp[1][0]=0;
vis[0]=0;
m=1<<n;
for(int i=1; i<m; i++) {
for(int j=0; j<n; j++) {
if(dp[i][j]==INF)continue;
for(int k=0; k<n; k++) {
if(i&(1<<k)||maps[j][k]==INF)continue; //二进制 1 表示该点走过,0表示没走过,第二维表示现在所在的点。压缩状态
if( dp[i|(1<<k)][k]>dp[i][j]+maps[j][k]) {
dp[i|(1<<k)][k]=dp[i][j]+maps[j][k];
vis[k]=min(vis[k],dp[i|(1<<k)][k]); //比较,去到下一点需要的最小路
}
}
}
}
int minn=1e9+100;;
for(int i=0; i<n; i++) {
minn=min(minn,dp[m-1][i]+vis[i]);
}
printf("%d\n",minn);
}
return 0;
}
ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩的更多相关文章
- POJ3311Hie with the Pie(floyd传递+DP,状态压缩)
问题 The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfo ...
- HDU 1429 胜利大逃亡(续)(DP + 状态压缩)
胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...
- hdu 4352 XHXJ's LIS (数位dp+状态压缩)
Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully readin ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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 允许多次经过的TSP
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5418 bestcoder(中文): http://bestcoder.hdu.edu.cn ...
- HDU 5418 Victor and World(状压DP+Floyed预处理)
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 ...
随机推荐
- 12.享元模式(Flyweight Pattern)
using System; using System.Collections; namespace ConsoleApplication5 { class Program { /// <summ ...
- Java内存泄露的理解与解决
依赖于引用判断的内存管理机制 Java中对内存对象的访问,使用的是引用的方式.在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间.在Ja ...
- WindowManagerPolicy的后缀 解释
转自:http://blog.csdn.net/hunanwy/article/details/8563090 Ti,called from the input thread. Input threa ...
- 6-02使用SQL语句向表中插入数据
插入语句的语法: INSERT INTO 表() VALUES(值列表) 注意事项: 1:每次插入一行数据,不能只插入半行或几列数据. 2:每一个数据值的数据类型.精度和小数位数必须与相应的列匹配. ...
- 多进程程序设计,王明学learn
多进程程序设计 一.函数学习 1.1 创建进程fork 1.1.1 函数原形 pid_t fork(void); 1.1.2 函数功能 创建一个子进程 1.1.3 所属头文件 <unistd.h ...
- Linggle: 英语写作学习搜索引擎
Linggle 搜索引擎是一个可用于英语写作的语法.句子工具,可帮助学习者分析更准确的英文写作建议,能够根据词性来推测短句和句子,可精准的分享出完整英文句子如何撰写. Linggle 是台湾学术团队研 ...
- 比较两个文件文件可以使用MD5比较工具
举例来说,当我们对一个设备进行升级. 固件程序是一个文件,而我们发送的数据可以组成一个文档, 实质是把这两个文件拖入到下图中的工具中,查看一下MD5值.SHA1值.CRC32的值,如果值都一样说明这两 ...
- 求数组的长度 C
对于数组array,计算其占用内存大小和元素个数的方法如下: C/C++ code ? 1 2 3 4 5 //计算占用内存大小 sizeof(array) //计算数组元素个数 sizeof(a ...
- POJ 1984 Navigation Nightmare 带全并查集
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...
- java线程之——synchronized的注意细节
我在学习synchronized的时候,十分好奇当一个线程进入了一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 然后就做了个实验(实验代码最后贴出),最后得到了如下 ...