这个题思路十分巧妙,感觉很多题都有类似的套路.
我们发现异或操作其实就是将一个数的二进制的若干个 $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\n",d[t]);
return 0;
}

  

最新文章

  1. 【前端】require函数实现原理
  2. 1171. Lost in Space
  3. IntelliJ IDEA 中文乱码问题解决办法
  4. Asp.Net MVC4入门指南(6):验证编辑方法和编辑视图
  5. 常用的css命名规则
  6. jQuery 模板插件jquery-tmpl
  7. Android读取RAM,ROM,SD卡容量
  8. linux的SVN搭建与同步
  9. CentOS 编译安装Apache2.4.10
  10. linux 环境下java环境配置
  11. Dojo实现Tabs页报错(二)
  12. LOJ#2087 国王饮水记
  13. jqgrid 插件的使用
  14. 【BZOJ3809】Gty的二逼妹子序列 莫队 分块
  15. CF552 E. Two Teams
  16. [LeetCode] 504. Base 7_Easy tag: Math
  17. Centos7 下coreseek的安装
  18. 精读JavaScript模式(一)
  19. 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
  20. ROS中发布激光扫描消息

热门文章

  1. vue父子组件相互传值的实例
  2. qt 两种按钮点击事件应用
  3. CentOS安装Netdata进行系统监控
  4. [转帖]数据库默认驱动、URL、端口
  5. [转帖]「白帽黑客成长记」Windows提权基本原理(下)
  6. yarn以及mapreduce部署
  7. gRPC编译教程
  8. Elasticsearch操作索引
  9. frame的处理
  10. wyy Downloader(当前置顶项目)