[POI2007]ATR-Tourist Attractions
题目大意:一个无向图,从$1$到$n$,要求必须经过$2,3,\dots,k+1$,给出一些限制关系,要求在经过$v\leq k+1$之前必须经过$u\leq k+1$,求最短路
题解:预处理出$1\dots k+1$到其他点的最短路,然后$f_{s,i}$表示当前在$i$已经经过的点的集合为$s$(压位)的最短路,然后$DP$就行了(原题卡内存,但我不大会啊,但在不卡内存的$bzoj$上过了)
卡点:1.$\&$优先级比$==$低
C++ Code:
#include <cstdio>
#include <cstring>
#include <ext/pb_ds/priority_queue.hpp>
#define maxn 20002
#define maxm 200002
#define maxk 20
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, k, g, ans, st;
int head[maxn], cnt;
struct Edge {
int to, nxt, w;
} e[maxm << 1];
void add(int a, int b, int c) {
e[++cnt] = (Edge) {b, head[a], c}; head[a] = cnt;
}
int f[1 << maxk][maxk + 2], d[maxk + 2][maxn], s[maxk + 2];
struct cmp {
bool operator () (const int &a, const int &b) const {
return d[st][a] > d[st][b];
}
};
inline int min(int a, int b) {return a < b ? a : b;}
__gnu_pbds::priority_queue<int, cmp> q;
__gnu_pbds::priority_queue<int, cmp>::point_iterator iter[maxn];
void dijkstra(int S) {
st = S;
for (int i = 1; i <= n; i++) d[S][i] = inf, iter[i] = q.push(i);
d[S][S] = 0;
q.modify(iter[S], S);
while (!q.empty()) {
int u = q.top(); q.pop();
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (d[S][v] > d[S][u] + e[i].w) {
d[S][v] = d[S][u] + e[i].w;
q.modify(iter[v], v);
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
add(b, a, c);
}
memset(f, 0x3f, sizeof f);
scanf("%d", &g);
for (int i = 1; i <= g; i++) {
int a, b;
scanf("%d%d", &a, &b);
s[b] |= 1 << a - 2;
}
for (int i = 1; i <= k + 1; i++) dijkstra(i);
if (!k) {
printf("%d\n", d[1][n]);
return 0;
}
f[0][1] = 0;
for (int i = 2; i <= k + 1; i++) if (!s[i]) f[1 << i - 2][i] = d[1][i];
for (int i = 0; i < 1 << k; i++) {
for (int j = 0; j < k; j++) {
if (i & 1 << j) {
for (int l = 0; l < k; l++) {
if ((~i & 1 << l) && ((i & s[l + 2]) == s[l + 2])) {
f[i | 1 << l][l + 2] = min(f[i | 1 << l][l + 2], f[i][j + 2] + d[j + 2][l + 2]);
}
}
}
}
}
ans = inf;
for (int i = 2; i <= k + 1; i++) ans = min(ans, f[(1 << k) - 1][i] + d[i][n]);
printf("%d\n", ans);
return 0;
}
[POI2007]ATR-Tourist Attractions的更多相关文章
- csp-s模拟48,49 Tourist Attractions,养花,画作题解
题面:https://www.cnblogs.com/Juve/articles/11569010.html Tourist Attractions: 暴力当然是dfs四层 优化一下,固定两个点,答案 ...
- [POI2007]Tourist Attractions
题目大意: 给你一个$n(n\leq 2\times 10^4)$个点,$m(m\leq 2\times 10^5)$条边的带边权的连通图.其中有$k(k\leq 20)$个关键点.关键点之间有$g$ ...
- LYDSY模拟赛day1 Tourist Attractions
/* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...
- 解题:POI 2007 Tourist Attractions
题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...
- 【JZOJ4857】Tourist Attractions(Bitset)
题意:给定一个n个点的无向图,求这个图中有多少条长度为4的简单路径. n<=1500 思路: #include<map> #include<set> #include&l ...
- [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)
题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...
- 比特镇旅游(Tourist Attractions)【暴力+Bitset 附Bitset用法】
Online Judge:NOIP2016十连测第一场 T2 Label:暴力,Bitset 题目描述 在美丽的比特镇一共有n个景区,编号依次为1到n,它们之间通过若干条双向道路连接. Byteasa ...
- D. 旅游景点 Tourist Attractions 状压DP
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...
- 旅游景点 Tourist Attractions 题解
题面在这里 再次破了纪录,连做了3天... 让我们从头来一点一点分析 1.预处理 先看题面,乍一看貌似是个图论题,有n个点m条边,给定一些必须经过的点和强制经过顺序,求一条最短路 我们发现n和m都比较 ...
- noip2016十连测round1
A:String Master 题目:所谓最长公共子串,比如串 A:"abcde",串 B:"jcdkl",则它们的最长公共子串为串 "cd" ...
随机推荐
- python__标准库 : urllib2
urllib,urllib2 urllib库主要用 urlencode()把字典转换成url的get参数或者post参数 或者用 quote() 进行编码unquote进行解码 用urllib2.Pr ...
- System.Speech使用
使用微软语音库 使用微软语音库可以很快速的制作一个小应用,比如一个唐诗的朗诵工具.本示例也是使用微软语音库,制作了一个唐诗宋词朗诵的应用,仅供加深学习印象 首先是要引入System.Speech库 然 ...
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- VS2017 远程调试小记
VS2017 远程调试小记 支持windows\linux\macos, 直接连接项目点的上线版本代码进行调试.保证bug在同个环境下实时追踪. 注意点 双方的 msvsmon.exe版本需一致,最好 ...
- HBase-site.xml 常见重要配置参数
HBase 常见重要配置参数 (1) Hbase.rpc.timeout rpc 的超时时间,默认 60s,不建议修改,避免影响正常的业务,在线上环境刚开始配置的是 3 秒,运行半天后发现了大量的 t ...
- 9.Mongodb与python交互
1.与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo impo ...
- 2、Java并发编程:如何创建线程
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- shell -- for、while用法
#数字段形式for i in {1..10}do echo $idone #详细列出(字符且项数不多)for File in 1 2 3 4 5do echo $Filedone #对存在的 ...
- Oracle 完全理解connect by-详细脚本-可实战
狒狒Q971751392 未来星开发团队--狒狒(QQ:9715234) oracle树查询的最重要的就是select…start with…connect by…prior语法了.依托于该语法,我们 ...
- nginx proxy_cache缓存详解
目录 1. 关于缓冲区指令 1.1 proxy_buffer_size 1.2 proxy_buffering 1.3 proxy_buffers 1.4 proxy_busy_buffers_siz ...