BZOJ 1097: [POI2007]旅游景点atr 状压,预处理,最短路

【异常】Codybuddy Error Code: 14003 too many requests 限流报错问题排查与解决指南 14003报错本质为服务端限流拦截,并非账号封禁或程序致命故障,90%以上的场景可通过等待冷却+规范使用行为解决。通过本文的排查步骤,可快速恢复工具使用,同时规避后续重复触发该问题。 阅读详情

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,总长度为1
9。注意FGD为了从城市2到城市4可以路过城市3,但不在城市3停留。这样就不违反FGD的要求了。并且由于FGD想要
走最短的路径,因此这个方案正是FGD需要的。
Input

  第一行包含3个整数N(2<=N<=20000),M(1<=M<=200000),K(0<=K<=20),意义如上所述。
Output

  只包含一行,包含一个整数,表示最短的旅行距离。
Sample Input
8 15 4

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
19

HINT

上面对应于题目中给出的例子。

解题思路: 首先预处理一下K+1个点间的最短路,这个可以堆优化Dij,或者SPFA,然后状压DP,那么如何DP?这个如果状压DP做的比较多还是很容易YY出来的,DP[i][j]代表当前状态是i,停留在第j个城市的走的最短距离。。那么转移就很好搞了。

dp[i][j]=min(dp[i][j],dp[k][x]+dis[x][i])

其中, k代表和状态i不冲突的状态,x代表k状态下停留在x的最短距离,那么dis[x][i]是x到i的最短路,这个已经预处理出来了,那么这个DP的复杂度是多少呢? O(2^k * k * k) 然后加上预处理最短路的时间,就是O(2^k*k*k + k*logk),就可以通过这个题了, 为了加速我还加了一个读入外挂。。具体细节见代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct FastIO
{
    static const int S = 1310720;
    int wpos;
    char wbuf[S];
    FastIO() : wpos(0) {}
    inline int xchar()
    {
        static char buf[S];
        static int len = 0, pos = 0;
        if (pos == len)
            pos = 0, len = fread(buf, 1, S, stdin);
        if (pos == len) return -1;
        return buf[pos ++];
    }
    inline int xuint()
    {
        int c = xchar(), x = 0;
        while (c <= 32) c = xchar();
        for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0';
        return x;
    }
    inline int xint()
    {
        int s = 1, c = xchar(), x = 0;
        while (c <= 32) c = xchar();
        if (c == '-') s = -1, c = xchar();
        for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0';
        return x * s;
    }
    inline void xstring(char *s)
    {
        int c = xchar();
        while (c <= 32) c = xchar();
        for (; c > 32; c = xchar()) * s++ = c;
        *s = 0;
    }
    inline void wchar(int x)
    {
        if (wpos == S) fwrite(wbuf, 1, S, stdout), wpos = 0;
        wbuf[wpos ++] = x;
    }
    inline void wint(LL x)
    {
        if (x < 0) wchar('-'), x = -x;
        char s[24];
        int n = 0;
        while (x || !n) s[n ++] = '0' + x % 10, x /= 10;
        while (n--) wchar(s[n]);
    }
    inline void wstring(const char *s)
    {
        while (*s) wchar(*s++);
    }
    ~FastIO()
    {
        if (wpos) fwrite(wbuf, 1, wpos, stdout), wpos = 0;
    }
} io;
const int maxn = 40005;
const int inf = 1e9;
int n, m, q, K, edgecnt, mask;
int bin[22], a[22], dis[22][22], head[maxn], d[maxn], dp[1048576][22], vis[maxn]; //dp[i][j]表示的是,状态为i,最后停留在j的最小的走的距离
struct node{int v, w, nxt; } E[400005];
void init(){
    bin[0] = 1;
    for(int i = 1; i < 22; i++) bin[i] = bin[i-1] << 1;
    memset(dp, -1, sizeof(dp));
    memset(head, -1, sizeof(head));
    edgecnt = 0;
}
void addedge(int u, int v, int w){
    E[edgecnt].v = v, E[edgecnt].w = w, E[edgecnt].nxt = head[u], head[u] = edgecnt++;
}
void dij(int x){ //预处理k个点的最短路
    priority_queue <pair <int, int>, vector <pair <int, int> > , greater <pair <int, int> > > q;
    for(int i = 1; i <= n; i++){
        vis[i] = 0;
        d[i] = inf;
    }
    d[x] = 0; q.push(make_pair(0, x));
    while(!q.empty()){
        int u = q.top().second;
        q.pop();
        if(vis[u]) continue; vis[u] = 1;
        for(int i = head[u]; ~i; i = E[i].nxt){
            int v = E[i].v;
            if(d[u] + E[i].w < d[v]){
                d[v] = d[u] + E[i].w;
                q.push(make_pair(d[v], v));
            }
        }
    }
    for(int i = 1; i <= K + 1; i++) dis[x][i] = d[i];
    dis[x][0] = d[n];
}

int main(){
    init();
    //scanf("%d%d%d", &n, &m, &K);
    n = io.xint(), m = io.xint(), K = io.xint();
    mask = bin[K] - 1;
    for(int i = 1; i <= m; i++){
        int u, v, w;
        //scanf("%d%d%d", &u, &v, &w);
        u = io.xint(), v = io.xint(), w = io.xint();
        addedge(u, v, w);
        addedge(v, u, w);
    }
    for(int i = 1; i <= K + 1; i++) dij(i);
    //scanf("%d", &q);
    q = io.xint();
    //筛选有效状态
    for(int i = 1; i <= q; i++){
        int u, v;
        //scanf("%d%d", &u, &v);
        u = io.xint(), v = io.xint();
        a[v] += bin[u - 2];
    }
    dp[0][1] = 0;
    for(int st = 0; st <= mask; st++){
        for(int x = 1; x <= K + 1; x++){
            if(dp[st][x] != -1){
                for(int i = 2; i <= K + 1; i++){
                    int en = (st | (bin[i - 2]));
                    if((st & a[i]) == a[i]){ //转移的限制条件
                        if(dp[en][i] > dp[st][x] + dis[x][i] || dp[en][i] == -1){
                            dp[en][i] = dp[st][x] + dis[x][i];
                        }
                    }
                }
            }
        }
    }
    int ans = inf;
    for(int i = 1; i <= K + 1; i++){
        if(dp[mask][i] == -1) continue; //不合法的状态不能比较
        ans = min(ans, dp[mask][i] + dis[i][0]);
    }
    printf("%d\n", ans);
    return 0;
 }
ICML-2025《Learning from Sample Stability for Deep Clustering》 用于指导深度聚类模型的训练,从而提升模型对困难样本的学习能力,最终改善整体聚类性能。首先,利用K-means在原始样本(非增强)的表征上进行聚类,得到初始聚类分配。其目的是鼓励模型对同一稳定样本在连续epoch中产生相近的表征。输出差异大)会产生更大的损失值,从而引导模型优先优化这些困难样本。此损失借鉴了NT-Xent损失的思想,但将正样本对定义为。最后,通过对比学习优化聚类中心,将同一聚类在。为了获得更具代表性的聚类中心,论文提出。为了学习更鲁棒的表征,模型在在线网络。首先,论文定义了样本。 阅读详情

相关推荐

ElasticSearch集群搭建

docker安装es集群

weixin_46562226的博客 2024

bzoj1097 [POI2007]旅游景点atr

Description \(\mathrm{FGD}\) 想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣 的事情。经过这些城市的顺序不是完全随意的,比如说 \(\mathrm{FGD}\) 不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是, \(\mathrm{FGD}\) 的旅程不是既定的,他可以在某些旅行方案...

weixin_30881367的博客 146

用 CL_SALV_TREE 把层级数据做成一棵会呼吸的 ABAP ALV 树:从类继承扫描到事件交互的完整拆解

本文介绍了SAP ABAP中使用CL_SALV_TREE实现树形ALV报表的方法。该技术将层级数据(如类继承关系)以可展开/折叠的树形结构展示,解决了传统ALV Grid无法直观显示层次结构的问题。核心实现采用"数据表+层级表"分离的设计模式:数据表存储节点业务信息,层级表维护父子关系。通过add_node方法动态构建树形结构,支持设置节点文本、图标和事件。文中提供了完整示例代码,演示了如何递归扫描ABAP类继承关系并构建树形ALV,这种技术特别适用于展示类族谱、权限树等层级数据,能显著

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 206

旅游景点atr

问题 D: 旅游景点atr 时间限制: 10 Sec  内存限制: 512 MB 题目描述 FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间

qq_37759040的博客 513

优化YOLOv8检测精度:Damo-YOLO的RepGFPN特征融合技术解析【YOLOv8】

YOLOv8在结构上依旧延续了自YOLOv4以来的CSPNet(Cross Stage Partial Network)和FPN(Feature Pyramid Network)的设计,结合了PANet(Path Aggregation Network)来增强特征的多尺度表达。然而,随着目标检测任务的复杂性增加,如何更有效地融合不同层级的特征成为提升检测性能的关键。Damo-YOLO中的RepGFPN引入了重参数化的思想,通过在训练和推理阶段对特征融合模块进行结构优化,显著提升了检测效果。

博客 1583

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2679

poi2007

一、旅游景点atr题:Description  FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣 的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山, 而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。由于 FGD非常讨厌乘车的颠簸,他希望在满足

fighting 984

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2460

Test 3.27 T2 旅行

Description FGD 想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说 FGD 不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是,FGD 的旅程不是既定的,他可以在某些旅行方案之间进行选择。由于 FGD 非常讨厌乘车的颠簸,他希望在满足他的要求的情况下,旅行...

weixin_30364147的博客 186

Vibe Draw:AI实现2D草图转3D建模,开源免费的设计师宝藏软件!

AI实现2D草图转3D建模,开源免费,设计师进来看一下?

Code_流苏:在代码中寻诗意,在实践中觅真知 2150

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

bzoj 1097: [POI2007]旅游景点atr(状压DP)

1097: [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MB Submit: 1509  Solved: 343 [Submit][Status][Discuss] Description   FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣 的事情。经过这些城市的顺

clover_hxy的博客 1650

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

bzoj1097: [POI2007]旅游景点atr[最短路预处理+状压dp]

既然经过不算停留,那么久自由地spfa预处理吧 然后

AC率最低的傻X 2139

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[bzoj1097][POI2007]旅游景点atr【最短路】【状压dp】

【题目链接】   https://www.lydsy.com/JudgeOnline/problem.php?id=1097 【题解】   首先预处理出前k+1个点到每个点的最短路。   然后状压dp。记f[i][j]f[i][j]表示当前停留在i,需要停留的点的状态为j,转移就枚举下一个停留点是哪里。   时间复杂度:O(K∗kM+2K∗K)...

dizhengyue1902的博客 136

【BZOJ1097】[POI2007]旅游景点atr 最短路+状压DP

【BZOJ1097】[POI2007]旅游景点atr Description   FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。...

aodanchui1057的博客 129

BZOJ_1097_[POI2007]旅游景点atr_状压DP

BZOJ_1097_[POI2007]旅游景点atr_状压DP 题面描述: FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣 的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山, 而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。由...

139

BZOJ 1097 POI2007 旅游景点atr SPFA+状压DP

题目大意:给定一张图,要求从第一个点出发,按照某个拓扑序遍历2~k+1的所有节点,然后到达n,求最短路径 首先将所有关键点之间的最短路用SPFA求出来 然后状压DP 令f[state][p]表示已经走过的点集为state,将要走到p点的最短路 记忆化搜索就行了- - 标准卡时过- - #include #include #include #include #define M 20

世界 1953

【BZOJ1097】[POI2007]旅游景点atr【最短路】【状压DP】【记忆化搜索】

k很小,所以可以状压。 先预处理出以1到k + 1为出发点的最短路,然后记忆化搜索。 /* Footprints In The Blood Soaked Snow */ #include #include #include #include #include using namespace std; typedef pair pii; const int max

BraketBN 876

BZOJ 1097 [POI2007]旅游景点atr

题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1097 思路 kk很小,考虑状压。 预处理出从11~(k+1)(k+1)出发,到其他点的距离,令fsta,ifsta,i表示走过的点状态为stasta,最后一个到达的点为ii,所需要行走的最短举例,操作起来还是有很多要注...

dilei7762的博客 218

BZOJ1097: [POI2007]旅游景点atr

Description   FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。由于FGD非常讨厌乘车的颠簸,他希望在满足他的要求的情况下,旅行的

wxh010910 677

BZOJ 1097 [POI2007]旅游景点atr dijikstra+状压DP

BZOJ 1097 [POI2007]旅游景点atr dijikstra+状压DP

-Claude 2322

BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra

题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不停留. 故我们在关键点之间进行转移的时候可以直接走最短路,而不用管别的. 令方程 $f[i][j]$ 表示访问过的关键点集合为 $i,$ 当前在点 $i$ 的最短路径. ...

weixin_30419799的博客 137

[BZOJ1097][POI2007]旅游景点atr(状压dp)

找到自己的路,然后执着的走下去吧!

薇小薇 815

bzoj1097 [POI2007]旅游景点atr(spfa+状压dp)

首先spfa预处理一下K个点以及起终点之间的最小距离。 然后比较显然的状压dp。f[S][i]表示走过了状态为S的点,现在在i的最短路。枚举一个j去转移,判断一下合法就好了。复杂度看上去是O(km+2kk2)O(km+2^kk^2)的。

Icefox的博客 403
上一篇: HDU 1512 Monkey King 可并堆,左偏树
下一篇: BZOJ 1098: [POI2007]办公楼biu 补图联通块个数,链表优化
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值