ll n,m;cin>>n>>m;
map<ll,vector<pll>>ve;
priority_queue<pll>qq;
vector<ll>dist(n+1,inf);
vector<array<ll,3>>acm;
rep(i,1,m){
ll u,v,w;cin>>u>>v>>w;
acm.push_back({u,v,w});
ve[u].push_back({v,w});
}
auto dj=[&](ll x)->void{
// cout<<"\n"<<x<<":\n";
dist.resize(n+1,inf);
while(qq.size())qq.pop();
map<ll,ll>vis;
dist[x]=0;
qq.push({0,x});//存距离和点的编号
while(qq.size()){
ll u=qq.top().y;
qq.pop();
if(vis[u])continue;
vis[u]=1;
for(auto s:ve[u]){//遍历u连接的所有点
ll v=s.x,w=s.y;
// cout<<u<<" "<<v<<endl;
if(dist[v]>dist[u]+w){
dist[v]=dist[u]+w;
qq.push({-dist[v],v});
}
}
}
};
dj(1);
ll sum=0;
rep(i,2,n)sum+=dist[i];
ve.clear();
for(auto k:acm){
ll u=k[0],v=k[1],w=k[2];
ve[v].push_back({u,w});
}
ll res=0;
rep(i,1,n)cout<<dist[i]<<endl;
}
就是算完1到其他的距离后再把原来方向全部相反后再dj(1)一次