如题,代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5+114;
const int inf = 1e18+7;
vector< pair<int,int> > edge[maxn*40];
int tr[maxn<<2][2];
int tot,n,m;
void build(int cur,int lt,int rt){
tr[cur][0]=++tot;
tr[cur][1]=++tot;
if(lt==rt){
edge[tr[cur][0]].push_back(make_pair(lt,0));
edge[lt].push_back(make_pair(tr[cur][1],0));
return ;
}
int mid=(lt+rt)>>1;
build(cur<<1,lt,mid);
build(cur<<1|1,mid+1,rt);
edge[tr[cur][0]].push_back(make_pair(tr[cur<<1][0],0));
edge[tr[cur][0]].push_back(make_pair(tr[cur<<1|1][0],0));
edge[tr[cur<<1][1]].push_back(make_pair(tr[cur][1],0));
edge[tr[cur<<1|1][1]].push_back(make_pair(tr[cur][1],0));
return ;
}
void update1(int cur,int lt,int rt,int l,int r,int x,int w){
if(l<=lt&&rt<=r){
edge[x].push_back(make_pair(tr[cur][0],w));
return ;
}
if(rt<l||lt>r) return ;
int mid=(lt+rt)>>1;
update1(cur<<1,lt,mid,l,r,x,w);
update1(cur<<1|1,mid+1,rt,l,r,x,w);
}
void update2(int cur,int lt,int rt,int l,int r,int x,int w){
if(l<=lt&&rt<=r){
edge[tr[cur][1]].push_back(make_pair(x,w));
return ;
}
if(rt<l||lt>r) return ;
int mid=(lt+rt)>>1;
update2(cur<<1,lt,mid,l,r,x,w);
update2(cur<<1|1,mid+1,rt,l,r,x,w);
}
priority_queue< pair<int,int> ,vector< pair<int,int> >,less< pair<int,int> > > q;
int vis[maxn],dis[maxn],s;
void dij(){
for(int i=1;i<=tot;i++) dis[i]=inf;
dis[s]=0;
q.push(make_pair(dis[s],s));
while(q.size()>0){
pair<int,int> u=q.top();
q.pop();
if(vis[u.second]==true) continue;
vis[u.second]=true;
for(pair<int,int> v:edge[u.second]){
if(dis[v.first]>dis[u.second]+v.second){
dis[v.first]=dis[u.second]+v.second;
q.push(make_pair(dis[v.first],v.first));
}
}
}
}
signed main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++) tot++;
build(1,1,n);
while(m--){
int opt;
cin>>opt;
if(opt==1){
int u,v,w;
cin>>u>>v;
edge[u].push_back(make_pair(v,w));
}
else if(opt==2){
int u,l,r,w;
cin>>u>>l>>r>>w;
update1(1,1,n,l,r,u,w);
}
else{
int u,l,r,w;
cin>>u>>l>>r>>w;
update2(1,1,n,l,r,u,w);
}
}
dij();
for(int i=1;i<=n;i++) cout<<(dis[i]==inf?-1:dis[i])<<' ';
}