题目大意:一个无向图,从$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的更多相关文章

  1. csp-s模拟48,49 Tourist Attractions,养花,画作题解

    题面:https://www.cnblogs.com/Juve/articles/11569010.html Tourist Attractions: 暴力当然是dfs四层 优化一下,固定两个点,答案 ...

  2. [POI2007]Tourist Attractions

    题目大意: 给你一个$n(n\leq 2\times 10^4)$个点,$m(m\leq 2\times 10^5)$条边的带边权的连通图.其中有$k(k\leq 20)$个关键点.关键点之间有$g$ ...

  3. LYDSY模拟赛day1 Tourist Attractions

    /* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...

  4. 解题:POI 2007 Tourist Attractions

    题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...

  5. 【JZOJ4857】Tourist Attractions(Bitset)

    题意:给定一个n个点的无向图,求这个图中有多少条长度为4的简单路径. n<=1500 思路: #include<map> #include<set> #include&l ...

  6. [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)

    题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...

  7. 比特镇旅游(Tourist Attractions)【暴力+Bitset 附Bitset用法】

    Online Judge:NOIP2016十连测第一场 T2 Label:暴力,Bitset 题目描述 在美丽的比特镇一共有n个景区,编号依次为1到n,它们之间通过若干条双向道路连接. Byteasa ...

  8. D. 旅游景点 Tourist Attractions 状压DP

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD 不希望在刚吃过一顿大餐之后立刻去下一 ...

  9. 旅游景点 Tourist Attractions 题解

    题面在这里 再次破了纪录,连做了3天... 让我们从头来一点一点分析 1.预处理 先看题面,乍一看貌似是个图论题,有n个点m条边,给定一些必须经过的点和强制经过顺序,求一条最短路 我们发现n和m都比较 ...

  10. noip2016十连测round1

    A:String Master 题目:所谓最长公共子串,比如串 A:"abcde",串 B:"jcdkl",则它们的最长公共子串为串 "cd" ...

随机推荐

  1. Linux中程序的编译和链接过程

    1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...

  2. C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误

    FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...

  3. SQLServer 将日期改造成标准日期格式(如: 2016/6 ->201606)

    同事给了份Excel 数据,导到数据库之后再查出来时发现顺序不好弄.于是想从数据源中做处理. 由于数据存在,年/月 与 年/月/日 的格式不好用datetime保存,于是用varchar保存. 数据处 ...

  4. json格式转化

    python: json.dumps() : dict转成str json.loads():str转成dict  (去除字符串eva() ) JS: JSON.parse(text[, reviver ...

  5. PHP.41-TP框架商城应用实例-后台16-商品属性2-AJAX添加、删除

     添加商品属性 思路:根据[后台15]类型表{id,type_name}与属性表{id,attr_name,attr_type,attr_option_values,type_id} 1.建表商品属性 ...

  6. 将List中的数据更新到数据库中

    List中有相应的数据,更新到数据库如下: 1.根据关键字查找后删除: foreach (var item in objSelList) { ADDaAn da = db.ADDaAns.Find(i ...

  7. java存储位置经典例子

    String a="a";String b="b";String c="ab";String d="ab";String ...

  8. 构建Http服务器

    可以通过多种途径来构建服务器用以响应客户端请求(~不提供实现源码,网上有相应资源~) (1)使用ServerSocket构建服务器 (2)使用Servlet构建服务器 (3)使用HttpServer构 ...

  9. 小议Android多进程以致Application多次初始化

    最近遇到一个bug,当应用加了多进程后,比如总共进程数为N,会出现在`startService()`时`onStartCommand()`方法会被重复调用`(N-1)`次的奇怪现象. ***## 祸起 ...

  10. CentOS环境安装JDK(二)

    安装JDK-7u79-linux-x64 打开虚拟机,进入终端: 1.假设用户名是tianjiale(则需要进入管理员角色,既root) (1).将用户名tianjiale添加到sudoer列表中 提 ...