• luogu 4366 [Code+#4]最短路 Dijkstra + 位运算 + 思维


    这个题思路十分巧妙,感觉很多题都有类似的套路.
    我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$.
    而每次按照某种顺序一位一位地异或也可以起到同时异或多位的结果.
    所以我们每次只要把每个节点连到只该变一位的节点就可以了.
    然后就直接跑一个最短路~ 

    #include <cstdio> 
    #include <algorithm>
    #include <cstring>  
    #include <queue> 
    #define N 100004    
    #define M 4000000 
    #define inf 10000000000000 
    #define ll long long 
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;  
    struct Node 
    {
        int u; 
        ll dis; 
        Node(int u=0,ll dis=0):u(u),dis(dis){}   
        bool operator<(Node b)const
        {
            return b.dis<dis;   
        } 
    };  
    priority_queue<Node>q;   
    int n,m,C,edges,s,t; 
    ll d[N];    
    int hd[N],nex[M],to[M],val[M],done[N];   
    inline void addedge(int u,int v,int c) 
    { 
        nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;  
    } 
    inline void Dijkstra() 
    { 
        int i,u,v; 
        for(i=0;i<=n;++i) d[i]=inf;
        d[s]=0, q.push(Node(s,0));  
        while(!q.empty()) 
        {
            Node e=q.top(); u=e.u,q.pop();
            if(done[u]) continue;  
            done[u]=1;
            for(i=hd[u];i;i=nex[i]) 
                if(d[to[i]]>d[u]+val[i]) 
                    d[to[i]]=d[u]+val[i],q.push(Node(to[i],d[to[i]]));    
        }      
    }
    int main() 
    {
        int i,j; 
        // setIO("input"); 
        scanf("%d%d%d",&n,&m,&C);
        for(i=1;i<=m;++i) 
        { 
            int u,v,c; 
            scanf("%d%d%d",&u,&v,&c), addedge(u,v,c);       
        } 
        for(i=0;i<=n;++i) 
        {
            int l; 
            for(l=0;(1<<l)<=n;++l) if((i^(1<<l))<=n)addedge(i,i^(1<<l),(1<<l)*C);          
        }  
        scanf("%d%d",&s,&t),Dijkstra(),printf("%lld
    ",d[t]); 
        return 0; 
    }
    

      

  • 相关阅读:
    1. 两数之和
    RabbitMQ主题交换机
    RabbitMQ路由
    RabbitMQ发布订阅
    RabbitMQ简介和安装
    55. 跳跃游戏
    63. 不同路径 II
    62. 不同路径
    6. Z 字形变换
    sql注入攻击与防御第一章(笔记)
  • 原文地址:https://www.cnblogs.com/guangheli/p/11391143.html
Copyright © 2020-2023  润新知