【BZOJ】1097: [POI2007]旅游景点atr(spfa+状压dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1097
首先还是我很sb。。。。想到了分层图想不到怎么串起来,,,以为用拓扑序搞转移,,后来感到不行。。。
QAQ
这种数据那么小,有明确的依赖性为嘛我想不到状压。。。(准确的说是没想到状压和分层图一起做。。。。
还有一个。。。。。。。为什么递推不行。。。(还是我写挫了。。。老wa。。)非得记忆化。。。。。。
(其实记忆化的话能省点不必要的状态吧。。。
。。。。
还有。。。和zyf一样,被卡在了。。!(s&(1<<(v-1)))。。。。。不去掉就tle。。也是喜闻乐见。。。
QAQ
(然后我spfa的vis标记打错了。。。。。。。调了好久。。QAQ
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)
#define grdm(g, x, i) for(int i=g.ihead[x]; i; i=g.e[i].next)
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } const int N=50005, oo=0x3f3f3f3f;
int d[22][N], vis[N], q[N], ihead[N], cnt, n, m, k;
struct dat { int next, to, w; }e[N*10*2];
void add1(int u, int v, int w) { e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; e[cnt].w=w; }
void add(int u, int v, int w) { add1(u, v, w); add1(v, u, w); }
void spfa(int s, int *f) {
memset(vis, 0, sizeof(int)*(n));
memset(f, 0x3f, sizeof(int)*(n));
int front=0, tail=0;
f[s]=0; q[tail++]=s; vis[s]=1;
while(front!=tail) {
int u=q[front++], v; if(front==N) front=0; vis[u]=0;
rdm(u, i) if(f[v=e[i].to]>f[u]+e[i].w) {
f[v]=f[u]+e[i].w;
if(!vis[v]) {
vis[v]=1;
if(f[q[front]]>f[v]) {
--front; if(front<0) front+=N;
q[front]=v;
}
else {
q[tail++]=v; if(tail==N) tail=0;
}
}
}
}
}
int ans[21][1<<(20)], b[22], all;
int dfs(int u, int s) {
if(ans[u][s]>=0) return ans[u][s];
if(s==all) return d[u][n-1];
int &a=ans[u][s]; a=oo;
for1(v, 1, k) if((b[v]&s)==b[v]) a=min(a, d[u][v]+dfs(v, s|(1<<(v-1))));
return a;
}
int main() {
read(n); read(m); read(k);
for1(i, 1, m) { int u=getint(), v=getint(), w=getint(); add(u-1, v-1, w); }
for1(i, 0, k) spfa(i, d[i]);
read(m);
for1(i, 1, m) { int u=getint(), v=getint(); b[v-1]|=(1<<(u-2)); }
all=(1<<k)-1;
CC(ans, -1);
printf("%d\n", dfs(0, 0));
return 0;
}
Description
FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。由于FGD非常讨厌乘车的颠簸,他希望在满足他的要求的情况下,旅行的距离尽量短,这样他就有足够的精力来欣赏风景或者是泡MM了^_^. 整个城市交通网络包含N个城市以及城市与城市之间的双向道路M条。城市自1至N依次编号,道路亦然。没有从某个城市直接到它自己的道路,两个城市之间最多只有一条道路直接相连,但可以有多条连接两个城市的路径。任意两条道路如果相遇,则相遇点也必然是这N个城市之一,在中途,由于修建了立交桥和下穿隧道,道路是不会相交的。每条道路都有一个固定长度。在中途,FGD想要经过K(K<=N-2)个城市。成都编号为1,上海编号为N,而FGD想要经过的N个城市编号依次为2,3,…,K+1. 举例来说,假设交通网络如下图。FGD想要经过城市2,3,4,5,并且在2停留的时候在3之前,而在4,5停留的时候在3之后。那么最短的旅行方案是1-2-4-3-4-5-8,总长度为19。注意FGD为了从城市2到城市4可以路过城市3,但不在城市3停留。这样就不违反FGD的要求了。并且由于FGD想要走最短的路径,因此这个方案正是FGD需要的。
Input
第一行包含3个整数N(2<=N<=20000),M(1<=M<=200000),K(0<=K<=20),意义如上所述。以下M行,每行包含3个整数X,Y,Z,(1<=X
Output
只包含一行,包含一个整数,表示最短的旅行距离。
Sample Input
1 2 3
1 3 4
1 4 4
1 6 2
1 7 3
2 3 6
2 4 2
2 5 2
3 4 3
3 6 3
3 8 6
4 5 2
4 8 6
5 7 4
5 8 6
3
2 3
3 4
3 5
Sample Output
HINT
 上面对应于题目中给出的例子。
Source
【BZOJ】1097: [POI2007]旅游景点atr(spfa+状压dp)的更多相关文章
- 【BZOJ-1097】旅游景点atr         SPFA + 状压DP
		
1097: [POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 1531 Solved: 352[Submit][Sta ...
 - BZOJ 1097: [POI2007]旅游景点atr( 最短路 + 状压dp )
		
先最短路预处理, 然后状压就行了 -------------------------------------------------------------------------- #include ...
 - BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra
		
题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不 ...
 - bzoj 1097 [POI2007]旅游景点atr(最短路,状压DP)
		
[题意] 给定一个n点m边的无向图,要求1开始n结束而且顺序经过k个点,给出经过关系x,y代表y必须在x之后经过,求最短路. [思路] 先对k个点进行spfa求出最短路. 设f[s][i]代表经过点集 ...
 - BZOJ 1097: [POI2007]旅游景点atr [DP 状压 最短路]
		
传送门 题意: 一个无向图,从$1$到$n$,要求必须经过$2,3,...,k+1$,给出一些限制关系,要求在经过$v \le k+1$之前必须经过$u \le k+1$ 求最短路 预处理出$1... ...
 - D. 旅游景点 Tourist Attractions  状压DP
		
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...
 - BZOJ1097: [POI2007]旅游景点atr
		
..k次最短路后,考虑如何满足先走一些点 用状压dp,每一个点考虑它所需要经过的点a[i],当当前走过的点包含a[i]时,i 这个点才可以到达. 写的时候用记忆化搜索. #include<bit ...
 - 【BZOJ1097】[POI2007]旅游景点atr 最短路+状压DP
		
[BZOJ1097][POI2007]旅游景点atr Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺 ...
 - bzoj [POI2007]旅游景点atr 状态压缩+Dij
		
[POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 2258 Solved: 595[Submit][Status][D ...
 
随机推荐
- Firemonkey的旁门左道[六]
			
转载:http://blog.csdn.net/qustdong/article/details/9992033 今天还是讲讲和图形有关的事情,这次的难度再增加些,不是直接改源代码了, 而是通过RTT ...
 - Centos镜像使用帮助
			
https://lug.ustc.edu.cn/wiki/mirrors/help/centos
 - PHP 遍历目录
			
$dir = $_SERVER['DOCUMENT_ROOT'].'/test'; //var_dump($dir);exit; function my_scandir($dir) { $files ...
 - jqGrid 各种参数 详解
			
JQGrid JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面 ...
 - kettle转换JavaScript获取命令行参数
			
日常开发中由于很多参数是变化的,需要在部署时才能确定.而写在配置文件里又显得很笨重,因而可以运行时实时指定.那么kettle是怎么获取命令行中的参数的呢? kettle可以通过转换里的JavaScri ...
 - sqlserver 常用语句
			
1.查询表中的RID RID=RowID=(fileID:pageID:slotID) SELECT sys.fn_PhysLocFormatter(%%physloc%%) AS rid,* FRO ...
 - Java for LeetCode 037 Sudoku Solver
			
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
 - ShortestPath:Layout(POJ 3169)(差分约束的应用)
			
布局 题目大意:有N头牛,编号1-N,按编号排成一排准备吃东西,有些牛的关系比较好,所以希望他们不超过一定的距离,也有一些牛的关系很不好,所以希望彼此之间要满足某个关系,牛可以 ...
 - poj 2739 Sum of Consecutive Prime Numbers 解题报告
			
题目链接:http://poj.org/problem?id=2739 预处理出所有10001以内的素数,按照递增顺序存入数组prime[1...total].然后依次处理每个测试数据.采用双重循环计 ...
 - 如何用OpenCV自带的adaboost程序训练并检测目标
			
参考博文: 1.http://blog.csdn.net/wuxiaoyao12/article/details/39227189 2.http://www.cnblogs.com/easymind2 ...