• 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; 
    }
    

      

  • 相关阅读:
    Unity3D ShaderLab 立方体图的反射遮罩
    Unity3D ShaderLab 简单的立方体图反射
    Unity3D ShaderLab 各向异性高光
    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩
    Unity3D ShaderLab 使用BlinnPhong高光类型
    Unity3D ShaderLab 创建自定义高光类型
    Unity3D ShaderLab 基础的高光实现
    Unity3D ShaderLab法线贴图
    Unity3D ShaderLab压缩混合纹理贴图
    Java几种建立实例的方法
  • 原文地址:https://www.cnblogs.com/guangheli/p/11391143.html
Copyright © 2020-2023  润新知