3040: 最短路(road)

本文介绍了一个使用C++编程语言,通过GNU PBDS库中的堆数据结构优化解决从点1到点N的最短路径问题的方法。该实现利用了pairing heap(配对堆)来提高Dijkstra算法的效率。

题目链接

题目大意:求点1到点N的最短路

题解:用pbds里的堆优化……

我的收获:get姿势

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ext/pb_ds/priority_queue.hpp>
#define ll long long
#define pa pair<ll,int>
#define llinf 9000000000000000000LL
using namespace std;
using namespace __gnu_pbds;
typedef __gnu_pbds::priority_queue<pa,greater<pa>,pairing_heap_tag > heap;
int n,m,cnt,last[1000005];
int T,rxa,rxc,rya,ryc,rp;
heap::point_iterator id[1000005];
int x,y,z;
ll dis[1000005];
struct data{int to,next,v;}e[10000005];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void insert(int u,int v,int w)
{
    e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[cnt].v=w;
}
void dijkstra()
{
    heap q;
    for(int i=1;i<=n;i++)dis[i]=llinf;
    dis[1]=0;id[1]=q.push(make_pair(0,1));
    while(!q.empty())
    {
        int now=q.top().second;q.pop();
        for(int i=last[now];i;i=e[i].next)
            if(e[i].v+dis[now]<dis[e[i].to])
            {
                dis[e[i].to]=e[i].v+dis[now];
                if(id[e[i].to]!=0)
                    q.modify(id[e[i].to],make_pair(dis[e[i].to],e[i].to));
                else id[e[i].to]=q.push(make_pair(dis[e[i].to],e[i].to));
            }
    }
}
int main()
{
    n=read();m=read();
    T=read();rxa=read();rxc=read();rya=read();ryc=read();rp=read();
    int a,b;
    for(int i=1;i<=T;i++)
    {
        x=((ll)x*rxa+rxc)%rp;
        y=((ll)y*rya+ryc)%rp;
        a=min(x%n+1,y%n+1);
        b=max(y%n+1,y%n+1);
        insert(a,b,100000000-100*a);
    }
    for(int i=1;i<=m-T;i++)
    {
        x=read(),y=read(),z=read();
        insert(x,y,z);
    }
    dijkstra();
    printf("%lld",dis[n]);
    return 0;
}
<think> 我们有一个条件判断语句:`if label_road or label_its:`,它的含义是只要`label_road`或`label_its`中有一个为True(或者可以解释为真值),则执行`continue`,跳过后续代码。如果希望两个都为False时才执行后续的代码,那么我们可以使用以下两种方式: 1. 使用`not`运算符和`and`来组合条件: ```python if not (label_road or label_its): # 执行后续代码 ``` 2. 或者使用德摩根定律,将其转换为: ```python if not label_road and not label_its: # 执行后续代码 ``` 但是注意原始代码中,如果条件成立(即至少有一个为真),则执行`continue`,然后跳过后续代码。因此,如果我们希望两个都为假时才执行后续代码,那么我们可以将条件取反,然后直接执行后续代码,而不需要`else`块。但是原逻辑是在条件成立时跳过后面的代码,所以我们可以这样改写: 原代码: ```python if label_road or label_its: continue # 后续代码 ``` 等价于: ```python if not label_road and not label_its: # 后续代码 ``` 但是注意,原代码中如果条件满足就`continue`(跳过循环中本次后续的代码),所以通常这个语句是在循环中(比如`for`或`while`)。因此,我们改写的时候,可以把条件取反,然后执行后续代码,而不需要`else`。 然而,如果我们不想改变原有的结构(比如我们仍然想保留`continue`来跳过某些情况),那么我们可以保持原条件,然后通过改变条件逻辑来实现。但是原条件已经满足要求:只要有一个为真就跳过。 所以,你的问题是:如何确保当两个都是`False`的时候才执行后续代码? 实际上,原代码已经实现了这个逻辑:当两个都为假时,不会进入`if`语句,因此不会执行`continue`,从而会执行后续代码。 所以,原代码就是我们想要的。 但是,如果我们要更清晰地表达“两个都为假”这个条件,我们可以改为: ```python if label_road or label_its: continue # 两个都为假时执行后续代码 ``` 或者,我们也可以写成: ```python if not (label_road or label_its): # 执行后续代码 ``` 但是这样就需要把后续代码放在这个`if`块内。如果后续代码很长,可能不利于阅读。而使用`continue`可以让代码保持扁平结构。 所以,根据你的需求,如果你希望两个都为假时执行后续代码,那么原始代码已经满足。因为当`label_road`和`label_its`都是假时,不会进入`if`,自然就会执行后续代码。 总结:原代码的逻辑就是当`label_road`或`label_its`至少有一个为真时,跳过后续代码;只有两个都为假时,才执行后续代码。 因此,你不需要修改,原代码就是正确的。 但是,如果你希望改写为更直接表达“两个都为假”的条件,并且不使用`continue`,而是将后续代码放在一个块中,可以这样: ```python if not label_road and not label_its: # 后续代码 ``` 或者: ```python if not (label_road or label_its): # 后续代码 ``` 这两种写法是等价的。 现在,假设我们有一个循环,我们想对每个元素判断,只有当两个标签都为假时才处理,否则跳过。那么我们可以这样写: 原始写法: ```python for item in items: # ... 可能有一些代码设置label_road和label_its if label_road or label_its: continue # 处理逻辑 ``` 改写后: ```python for item in items: # ... if not (label_road or label_its): # 处理逻辑 ``` 或者: ```python for item in items: # ... if not label_road and not label_its: # 处理逻辑 ``` 根据你的喜好选择。第一种(使用`continue`)的优点是,当跳过条件比较复杂时,可以提前退出,避免过深的嵌套。 所以,你的原代码没有问题,可以保持原样。 但是,如果你遇到了问题,比如两个都是假的时候没有执行后续代码,那么可能是其他原因。请检查`label_road`和`label_its`的值是否真的是假值(例如`False`, `None`, `0`, `""`, `[]`, `{}`等,具体取决于上下文)。 在Python中,`or`操作符会进行短路求值,并且返回第一个为真的值,如果没有真值则返回后一个假值。但是在条件判断中,只要表达式的结果是真值(truthy)就会执行条件块。 因此,确保你的变量是布尔类型,或者你清楚它们的真值特性。 例如,如果`label_road`是空字符串,那么它被视为假;如果是非空字符串,则被视为真。 所以,根据你的具体数据类型,确保你的逻辑符合预期。 </think> 这段代码使用了`or`逻辑运算符来控制流程。理解其行为的关键在于`or`运算符的工作方式以及`continue`语句的作用。 ### 代码解释: ```python if label_road or label_its: continue # 后续执行的代码... ``` #### 逻辑行为: 1. **条件判断**: - `label_road or label_its`:只要`label_road`或`label_its`中**任意一个为真值**: - 表达式结果为`True` - 执行`continue` - **只有二者都为假值**时: - 表达式结果为`False` - 跳过`continue` - 执行后续代码 2. **`continue`的作用**: - 当执行`continue`时,会**立即跳过当前循环迭代**中剩余的所有代码 - 直接进入下一个循环迭代(如果位于循环中) #### 真/假值判定: 在Python中,以下值被视为**假值**(False): - `False` - `None` - 数值零 (`0`, `0.0`) - 空序列/集合 (`""`, `[]`, `()`, `{}`) - 自定义对象实现`__bool__()`返回False 所有其他值都被视为**真值**(True) ### 等价改写: 如果要更明确地表达"两者都为假时执行后续代码",可用以下任一方式: ```python # 方案1:显式检查假值 if not label_road and not label_its: # 后续代码... # 方案2:使用德摩根定律 if not (label_road or label_its): # 后续代码... ``` ### 典型使用场景: ```python data = [ {"label_road": True, "label_its": False, "value": "A"}, {"label_road": False, "label_its": False, "value": "B"}, {"label_road": False, "label_its": True, "value": "C"}, ] for item in data: if item["label_road"] or item["label_its"]: continue # 跳过包含任一标签的数据 print(f"处理未标记数据: {item[&#39;value&#39;]}") # 这里添加业务逻辑... ``` 输出: ``` 处理未标记数据: B ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值