这个题目由于只有16个城市,很容易想到去用状压来保存状态。

p[i][state]表示到i城市经过state状态的城市的最优值(state的二进制位每一位为1表示经过了该城市,否则没经过)

这样p[j][state|(1<<i)] = min(p[i][state]+dis[i][j])了

方程出来了不会遍历,打BC的时候,一开始用dfs遍历T了一发。后来换成SPFA了,不过当时脑子昏了,竟然忘记对队列里的数进行判重了,不过终测竟然没过,去HDU上用G++交是可以AC的。。

可能是不判重,SPFA常数比较大,有点卡时间。

判重加上就好了。

看到最后题解先用Floyed得到了两点之间的最短路。先不管两点间经过多少个点。不过用上面的做法应该是不用这一步也可以的。

然后再dp方程。遍历需要先遍历state。

不管怎样先粘代码吧,下次再打上Div1吧。

代码:(spfa)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <utility>
#include <string>
#include <algorithm>
#define LL long long using namespace std; typedef pair<int, int> pii;
int dis[][], n, m;
int vis[][];
int p[][]; inline int myMin(int now, int tmp)
{
if (now == -)
return tmp;
else
return min(now, tmp);
} void input()
{
scanf("%d%d", &n, &m);
memset(dis, -, sizeof(dis));
int u, v, w;
for (int i = ; i < m; ++i)
{
scanf("%d%d%d", &u, &v, &w);
dis[u][v] = dis[v][u] = myMin(dis[u][v], w);
}
} void spfa()
{
pii k;
int now, state, pre;
queue<pii> q;
q.push(pii(, ));
vis[][] = true;
while (!q.empty())
{
k = q.front();
q.pop();
now = k.first; state = k.second;
vis[now][state] = false;
for (int i = ; i <= n; ++i)
{
if (i == now || dis[i][now] == -)
continue;
pre = p[i][state|(<<now)];
p[i][state|(<<now)] = myMin(p[i][state|(<<now)], p[now][state]+dis[i][now]);
if (pre != p[i][state|(<<now)] && !vis[i][state|(<<now)])
{
vis[i][state|(<<now)] = true;
q.push(pii(i, state|(<<now)));
}
}
}
} void work()
{
if (n == )
{
printf("0\n");
return;
}
memset(p, -, sizeof(p));
memset(vis, false, sizeof(vis));
p[][] = ;
int state = ;
for (int i = ; i <= n; ++i)
state |= (<<i);
spfa();
printf("%d\n", p[][state]);
} int main()
{
//freopen("test.in", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times < T; ++times)
{
input();
work();
}
return ;
}
 

ACM学习历程—HDU5418 Victor and World(动态规划 && 状压)的更多相关文章

  1. ACM学习历程—HDU2476 String painter(动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...

  2. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  3. HDU5418.Victor and World(状压DP)

    #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #i ...

  4. [hdu5418 Victor and World]floyd + 状压DP 或 SPFA

    题意:给n个点,m条边,每次只能沿边走,花费为边权值,求从1出发经过所有其它点≥1次最后回到1的最小花费. 思路: 状压DP.先用Floyd得到任意两点间的最短距离,转移时沿两个点的最短路转移.此时的 ...

  5. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  6. 动态规划---状压dp

    状压dp,就是把动态规划之中的一个个状态用二进制表示,主要运用位运算. 这里有一道例题:蓝书P639猛兽军团1 [SCOI2005]互不侵犯 题目: 题目描述 在N×N的棋盘里面放K个国王,使他们互不 ...

  7. 状态压缩动态规划(状压DP)详解

    0 引子 不要999,也不要888,只要288,只要288,状压DP带回家.你买不了上当,买不了欺骗.它可以当搜索,也可以卡常数,还可以装B,方式多样,随心搭配,自由多变,一定符合你的口味! 在计算机 ...

  8. ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...

  9. ACM学习历程—Hihocoder 1290 Demo Day(动态规划)

    http://hihocoder.com/problemset/problem/1290 这题是这次微软笔试的第三题,过的人比第一题少一点,这题一眼看过去就是动态规划,不过转移方程貌似不是很简单,调试 ...

随机推荐

  1. git stash 保存当前工作状态

    1. git stash   暂存当前工作状态 2. git stash list 查看暂存列表 3. git stash save 'title' 暂存工作状态并添加说明 4. git stash ...

  2. modelsim-altera IP核仿真

    modelsim 仿真fifo时出现 Instantiation of 'scfifo' failed. The design unit was not found. 2012-07-21 13:27 ...

  3. 宜信开源|微服务任务调度平台SIA-TASK入手实践

    引言 最近宜信开源微服务任务调度平台SIA-TASK,SIA-TASK属于分布式的任务调度平台,使用起来简单方便,非常容易入手,部署搭建好SIA-TASK任务调度平台之后,编写TASK后配置JOB进行 ...

  4. MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出

    粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损 ...

  5. 三分钟教你学Git(十二) 之 fast-forward

    什么是fast forward, 顾名思义,就是高速向前进,Git怎么做到高速的呢? 原来假设Git判定能够fast forward的时候,直接改动当前HEAD指针的指向然后再改动当前HEAD指针.说 ...

  6. ASP.NET动态网站制作(13)-- JQ(5)

    前言:jq的最后一节课,主要讲解应用, 内容: 1.会飞的li: HTML代码: <!DOCTYPE html> <html xmlns="http://www.w3.or ...

  7. c# 根据读取的配置信息删除某个目录及下所有文件

    #region 定时删除目录文件 /// <summary> /// 定时删除目录文件 /// northeasttycoon /// </summary> /// <p ...

  8. COGS410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  9. 九度OJ 1156:谁是你的潜在朋友 (并查集)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5802 解决:2593 题目描述: "臭味相投"--这是我们描述朋友时喜欢用的词汇.两个人是朋友通常意味着他们存在着许多 ...

  10. 观察OnPaint与OnIdle与OnSize事件

    import wx class SketchWindow(wx.Window): def __init__(self, parent, ID): wx.Window.__init__(self, pa ...