【xsy1162】鬼计之夜 最短路+二进制拆分

套路题(然而我没看题解做不出来)

题目大意:给你一个n个点,m条有向边的图。图中有k个标记点,求距离最近的标记点间距离。

数据范围:n,m,k105

 

pi示第i个标记点的编号,设K为最小正整数,满足2Kk

我们在原图中新建点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 }
复制代码

 

posted @   AlphaInf  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示