#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include<bitset>
#include<list>
#include<set>
#include<utility>
#include<iomanip>
#define IO ios::sync_with_stdio(false)
#define eps 1e-7
#define int long long
using namespace std;
struct tre
{
int ls,rs;
}t[300002*20];
struct node
{
int v,val;
bool operator < (const node &vv) const
{
return vv.val<val;
}
};
//list<node>lis[100002*21*3];
int n,qq,s,dis[100002*3],cnt,rt1,rt2,tot,ver[100002*20],nex[100002*20],head[300002*20],edge[100002*21];
const int inf=0x3fffffffffffff;
priority_queue<node>q;
void adde(int x,int y,int z)
{
ver[++tot]=y,edge[tot]=z;
nex[tot]=head[x],head[x]=tot;
}
void buildin(int &o,int l,int r)
{
if(l==r)
{
o=l;
return;
}
o=++cnt;
int mid=l+r>>1;
buildin(t[o].ls,l,mid);
buildin(t[o].rs,mid+1,r);
adde(t[o].ls,o,0);
adde(t[o].rs,o,0);
}
void buildout(int &o,int l,int r)
{
if(l==r)
{
o=l;
return;
}
o=++cnt;
int mid=l+r>>1;
buildout(t[o].ls,l,mid);
buildout(t[o].rs,mid+1,r);
adde(o,t[o].ls,0);
adde(o,t[o].rs,0);
}
int L,R;
void upd(int o,int l,int r,int f,int val,int typ)
{
if(L<=l&&R>=r)
{
if(typ==2)
{
adde(f,o,val);
}
else
{
adde(o,f,val);
}
return;
}
int mid=l+r>>1;
if(L<=mid)
{
upd(t[o].ls,l,mid,f,val,typ);
}
if(R>mid)
{
upd(t[o].rs,mid+1,r,f,val,typ);
}
}
signed main()
{
IO;
cin>>n>>qq>>s;
cnt=n;
buildout(rt1,1,n);
buildin(rt2,1,n);
for(int i=1;i<=qq;i++)
{
int op,f,t,val;
cin>>op;
if(op==1)
{
cin>>f>>t>>val;
adde(f,t,val);
}
else if(op==2)
{
cin>>f>>L>>R>>val;
upd(rt1,1,n,f,val,op);
}
else
{
cin>>f>>L>>R>>val;
upd(rt2,1,n,f,val,op);
}
}
for(int i=0;i<=100001*3-3;i++)
{
dis[i]=inf;
}
dis[s]=0;
q.push((node){s,0});
while(!q.empty())
{
int vii=q.top().v;
if(-dis[vii]+q.top().val!=0)
{
q.pop();
continue;
}
q.pop();
for(int i=head[vii];i;i=nex[i])
{
if(dis[vii]+edge[i]<dis[ver[i]])
{
dis[ver[i]]=dis[vii]+edge[i];
q.push((node){ver[i],dis[ver[i]]});
}
}
}
//cout<<inf<<endl;
for(int i=1;i<=n;i++)
{
if(dis[i]<inf)
{
cout<<dis[i]<<" ";
}
else
{
cout<<"-1"<<" ";
}
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交