【xsy1162】鬼计之夜 最短路+二进制拆分
套路题(然而我没看题解做不出来)
题目大意:给你一个n个点,m条有向边的图。图中有k个标记点,求距离最近的标记点间距离。
数据范围:n,m,k≤105。
设pi表示第i个标记点的编号,设K为最小正整数,满足2K≥k。
我们在原图中新建点S和点T,做2K次最短路。
对于K个二进制位,将k个关键点分成两部分,以其中一部分为起点,向另一部分做最短路即可。
时间复杂度:O(m log n logk)
1 #include<bits/stdc++.h> 2 #define M 200005 3 #define L long long 4 #define INF (1LL<<60) 5 using namespace std; 6 7 struct edge{L u,v,next;}e[M*2]={0}; L head[M]={0},use=0; 8 void add(L x,L y,L z){use++;e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use;} 9 L vis[M]={0},S,T,n,m,k; 10 11 struct node{ 12 L u,dis; node(){u=dis=0;} 13 node(L U,L Dis){u=U; dis=Dis;} 14 friend bool operator <(node a,node b){return a.dis>b.dis;} 15 };priority_queue<node> q; 16 17 L bfs(){ 18 memset(vis,0,sizeof(vis)); 19 q.push(node(S,0)); 20 while(!q.empty()){ 21 node U=q.top(); q.pop(); 22 if(U.u==T) return U.dis; 23 if(vis[U.u]) continue; 24 vis[U.u]=1; 25 for(L i=head[U.u];i;i=e[i].next) 26 if(vis[e[i].u]==0) 27 q.push(node(e[i].u,U.dis+e[i].v)); 28 } 29 return INF; 30 } 31 L u[M]={0},v[M]={0},w[M]={0},id[M]={0}; 32 main(){ 33 scanf("%lld%lld%lld",&n,&m,&k); S=0; T=n+1; 34 for(L i=1;i<=m;i++) scanf("%lld%lld%lld",u+i,v+i,w+i); 35 for(L i=1;i<=k;i++) scanf("%lld",id+i); 36 L ans=INF; 37 for(L p=1;p<=k;p<<=1){ 38 memset(head,0,sizeof(head)); use=0; 39 for(L i=1;i<=m;i++) add(u[i],v[i],w[i]); 40 for(L i=1;i<=k;i++) 41 if(p&i) add(S,id[i],0); 42 else add(id[i],T,0); 43 ans=min(ans,bfs()); 44 45 memset(head,0,sizeof(head)); use=0; 46 for(L i=1;i<=m;i++) add(u[i],v[i],w[i]); 47 for(L i=1;i<=k;i++) 48 if(p&i) add(id[i],T,0); 49 else add(S,id[i],0); 50 ans=min(ans,bfs()); 51 } 52 cout<<ans<<endl; 53 }
分类:
倍增
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!