首页 > 其他分享 >[Code+#4]最短路

[Code+#4]最短路

时间:2022-12-14 20:44:41浏览次数:43  
标签:+# Code xor int 短路 times reads edge data

[$Code$+#4]最短路 链接:https://www.luogu.com.cn/problem/P4366 题面:给定一个$n$个点,$m$条边的无向图,若任意点对$(i,j)$之间还有一条长为$(i xor j)\times C$的边,求$A$到$B$的最短路。 题解:$(i xor j)\times C$这个式子看似很毒瘤,实际上我们可以把每一位拆开来看,若要从$9$走到$7$: $((1001)_{2} xor (111)_{2})\times C$ $=(1000)_{2}\times C+(10)_{2}\times C+(100)_{2}\times C$ $=((1001)_{2}xor(1)_{2})\times C+((1)_{2}xor(11)_{2})\times C+((11)_{2}xor(111)_{2})\times C$ 上述等式的含义即为$(1001)_{2}->(111)_{2}$等价于$(1001)_{2}->(1)_{2}->(11)_{2}->(111)_{2}$ 推广即得,任意$(i,j)$的边,都可以被拆成若干个$(i,(i xor 2^t))$的边的权值和,每一个点$i$向$(i xor 2^t)$连边即可。 ``` #include #include using namespace std; struct node { int v,data,nxt; }; struct reads { int num,data; bool operator < (const reads &a)const { return data>a.data; } }; reads tmp; priority_queueq; node edge[4000001]; int head[200001],len,dis[200001],n,m,C; bool used[200001]; void add(int x,int y,int z) { edge[++len].v=y; edge[len].data=z; edge[len].nxt=head[x]; head[x]=len; return; } reads make_reads(int x,int y) { tmp.num=x; tmp.data=y; return tmp; } void dijkstra(int x) { q.push(make_reads(x,0)); for (int i=0;i<=n;++i) dis[i]=(i!=x)*1e9; int top; while (!q.empty()) { top=q.top().num; q.pop(); if (used[top]) continue; used[top]=1; for (int i=head[top];i>0;i=edge[i].nxt) if (dis[edge[i].v]>dis[top]+edge[i].data) { dis[edge[i].v]=dis[top]+edge[i].data; q.push(make_reads(edge[i].v,dis[edge[i].v])); } } } int main() { int x,y,z,A,B; cin>>n>>m>>C; for (int i=1;i<=m;++i) { cin>>x>>y>>z; add(x,y,z); } for (int i=0;i<=n;++i) for (int k=1;k<=2*n;k*=2) if ((i^k)<=n) add(i,i^k,k*C); cin>>A>>B; dijkstra(A); cout<

标签:+#,Code,xor,int,短路,times,reads,edge,data
From: https://www.cnblogs.com/zhouhuanyi/p/16983476.html

相关文章

  • 浅析次短路
    统计次短路数量Sightseeing求最短路与次短路(只与最短路长度相差\(1\)的次短路)数量之和。最短路首先回顾我们如何统计最短路数量,我们使用\(cnt[j]\)表示从源点到\(......
  • web前端--Code Review
    2022年马上结束了,年底了,做一些总结吧。主要关于每次前端的CodeReview注意事项,做的一些总结如下:数据处理在提交前处理,尽量不要在onChange中处理列表与详情页的源进源......
  • PHPstorm配置PHP_CodeSniffer代码检查工具
    目录1.PHPCodeSniffer介绍2.安装PHP_CodeSniffer3.使用PHPStorm设置PHPCS4.测试PHP_CodeSniffer的检测功能参考资料1.PHPCodeSniffer介绍PHP_CodeSniffer对PHP文......
  • PWN ORW 最短的shellcode(33字节!)
    前言:下面的rdx就是read(1,buf,n)中的n,这个值太大或者太小都没办法正常读。所以分两种大情况:orw:(64bit,34字节,针对需要调整rdx的情况:)shellcode=asm('''movedx,0x6761......
  • AtCoder Regular Contest 143 E Reversi
    AtCoder传送门洛谷传送门翻转一个点会把它相邻的点全部翻转,因此先从叶子开始自下而上考虑。不难发现,如果这个叶子是白色,那么它一定比它的父亲先翻转(否则它就翻不了了);而......
  • AtCoder Regular Contest 150 F Constant Sum Subsequence
    AtCoder传送门洛谷传送门定义\(\mathrm{nxt}(i,x)\)为最小的\(j\)满足\(a_j=x\)且\(j>i\),\(\mathrm{pre}(i,x)\)为最大的\(j\)满足\(a_j=x\)且\(j<......
  • spring boot+ nginx 搭建简单的文件服务器,实现上传下载
    项目中用的文件服务的上传和下载访问的问题,由于疫情没有办法接入大的分布式是文件服务器中,自己就动手搭建一个文件服务器来nginx+springboot。实现的主要思路如下:springb......
  • VC++判断网络连接状态
    在开发中,需要判断是否有网络连接,实现函数如下:#include<Wininet.h>BOOLCMFCDemoDlg::DoHaveInternetConnection(){BOOLbRet=FALSE;//如果函数返回FALSE,则肯定......
  • spring boot + Redis实现消息队列-生产消费者
    实现思路:Redis本身提供了一个发布/订阅模式,但生产消费者模式需要我们自己去实现。利用Redis中的队列,将新消息放入名称为xx的队列末尾,完成消息生产者。启动一个线程,使用​​b......
  • Elasticsearch+Logstash+Kiabana 日志管理
       日志是分析线上问题的重要手段,通常我们会把日志输出到控制台或者本地文件中,排查问题时通过根据关键字搜索本地日志,但越来越多的公司,项目开发中采用分布式的架构,日......