当前位置:网站首页>Cf464e the classic problem [shortest path, chairman tree]
Cf464e the classic problem [shortest path, chairman tree]
2022-07-06 03:44:00 【QuantAsk】
On the subject
Topic link :https://www.luogu.com.cn/problem/CF464E
The main idea of the topic
n n n A little bit m m m An undirected graph with edges , The first i i i The length of the strip is 2 x i 2^{x_i} 2xi, seek s s s To t t t One of the most short circuit .
1 ≤ n ≤ 1 0 5 , 0 ≤ m , x i ≤ 1 0 5 1\leq n\leq 10^5,0\leq m,x_i\leq 10^5 1≤n≤105,0≤m,xi≤105
Their thinking
shortest path , But maintain binary weights with the chairman tree .
One position plus 1 1 1 When we start with him, we put him back 1 1 1 All become 0 0 0, Then these 0 0 0 In front of the 1 1 1 Just fine .
Compare the size, and find the first different position from high to low , To achieve this function, we can maintain a h a s h hash hash.
Then reload these two operations and you can run directly dij \text{dij} dij Just fine .
Time complexity : O ( n log 2 n ) O(n\log^2 n) O(nlog2n)
There are also natural overflow hashes. Don't use them 2 2 2 Idempotent number
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ull unsigned long long
using namespace std;
const int N=1e5+100,M=(N+10)<<6,P=1e9+7;
struct edge{
int to,next,w;
}a[N<<1];
int n,m,s,t,ans,tot,ls[N],rt[N],pre[N],c[N];
ull pw[N+10],one[N+10];bool v[N];
struct SegTree{
ull w[M];int cnt=1,ls[M],rs[M];
bool CMP(int x,int y,int L,int R){
if(w[x]==w[y])return 0;
if(L==R)return w[x]<w[y];
int mid=(L+R)>>1;
if(w[rs[x]]==w[rs[y]])return CMP(ls[x],ls[y],L,mid);
return CMP(rs[x],rs[y],mid+1,R);
}
int Make(int x,int &now,int L,int R,int st){
if(L>=st&&w[x]==one[R-L+1])
{
now=0;return 0;}
now=++cnt;w[now]=w[x];
ls[now]=ls[x];rs[now]=rs[x];
if(L==R){
w[now]=1;return L;}
int mid=(L+R)>>1;int flag=0;
if(L>=st){
if(w[ls[x]]==one[mid-L+1]){
ls[now]=0;
flag=Make(rs[x],rs[now],mid+1,R,st);
}
else flag=Make(ls[x],ls[now],L,mid,st);
}
else{
if(st<=mid)flag=Make(ls[x],ls[now],L,mid,st);
if(!flag)flag=Make(rs[x],rs[now],mid+1,R,st);
}
w[now]=w[ls[now]]+w[rs[now]]*pw[mid-L+1];
return flag;
}
void Get(int x,int L,int R){
if(L==R){
ans=(2ll*ans+w[x])%P;return;}
int mid=(L+R)>>1;
Get(rs[x],mid+1,R);
Get(ls[x],L,mid);
}
}T;
struct node{
int id,rt;
};
bool operator<(const node &x,const node &y)
{
return T.CMP(y.rt,x.rt,0,N);}
priority_queue<node> q;
void addl(int x,int y,int w){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;a[tot].w=w;
return;
}
void Dij(){
rt[s]=c[s]=1;q.push((node){
s,rt[s]});
while(!q.empty()){
int x=q.top().id;q.pop();
if(v[x])continue;v[x]=1;
if(x==t)return;
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(v[y])continue;
int nr;T.Make(rt[x],nr,0,N,a[i].w);
if((!c[y])||T.CMP(nr,rt[y],0,N))
{
pre[y]=x;c[y]=c[x]+1;rt[y]=nr;q.push((node){
y,nr});}
}
}
}
void print(int x){
if(pre[x])print(pre[x]);
printf("%d ",x);
}
int main()
{
// freopen("base.in","r",stdin);
// freopen("base.out","w",stdout);
scanf("%d%d",&n,&m);pw[0]=1;
for(int i=1;i<N+10;i++)
pw[i]=pw[i-1]*131ull,one[i]=one[i-1]*131ull+1ull;
for(int i=1;i<=m;i++){
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
if(x==16&&y==24&&m==197)
printf("%d ",v);
addl(x,y,v);addl(y,x,v);
}
scanf("%d%d",&s,&t);
Dij();
if(!c[t])return puts("-1")&0;
T.Get(rt[t],0,N);
printf("%d\n%d\n",ans,c[t]);
print(t);putchar('\n');
return 0;
}
边栏推荐
- Take you to wechat applet development in 3 minutes
- SAP ALV单元格级别设置颜色
- JS music online playback plug-in vsplayaudio js
- svg拖动点裁剪图片js特效
- Recommended papers on remote sensing image super-resolution
- Basic concepts of LTE user experience
- Multi project programming minimalist use case
- 2.2 STM32 GPIO operation
- Factors affecting user perception
- 潘多拉 IOT 开发板学习(HAL 库)—— 实验9 PWM输出实验(学习笔记)
猜你喜欢
随机推荐
Record the process of reverse task manager
Pytorch基础——(2)张量(tensor)的数学运算
RT-Thread--Lwip之FTP(2)
1.16 - check code
A brief introduction to symbols and link libraries in C language
C language judgment, ternary operation and switch statement usage
Princeton University, Peking University & UIUC | offline reinforcement learning with realizability and single strategy concentration
Four logs of MySQL server layer
出现Permission denied的解决办法(750权限谨慎使用)
JS Vanke banner rotation chart JS special effect
Mysqldump data backup
Redo file corruption repair
Yyds dry inventory what is test driven development
Mapping between QoE and KQI
Blue Bridge Cup - day of week
User experience index system
Flask learning and project practice 8: introduction and use of cookies and sessions
遥感图像超分辨率论文推荐
WPF效果第一百九十一篇之框选ListBox
cookie,session,Token 这些你都知道吗?