struct node{
int ne,v;
node(int _n,int _v):ne(_n),v(_v){}
};
vector<struct node> edge[n];#构造图
for(int i=0;i<e.size();i++){
int x=e[i][0];
int y=e[i][1];
int z=e[i][2];
edge[x].emplace_back(node(y,z));
}
int vis[n];
int d[n];
priority_queue<pair<int,int>> q;
function<int(int ,int,vector<vector<node>>&)>len=[&](int s,int t,vector<vector<node>>& edge) {
while(q.size())q.pop();
memset(vis,0,sizeof(vis));
memset(d,0x3f,sizeof(d));
q.push(make_pair(0,s));
d[s]=0;
while(q.size()){
int x=q.top().second;
q.pop();
if(vis[x])continue;//最重要 避免重复计算 或者if(q.top().first>d[x])
vis[x]=1;
//注意dij中v数组的意思是是否已经确定为最小值,所以需要在弹出最小根堆时赋值为1
for (int i=0;i<edge[x].size();i++) {
int len=edge[x][i].v;
int y=edge[x][i].ne;
if(d[y]>d[x]+len) {
d[y]=d[x]+len;
q.push(make_pair(-d[y],y));
}
}
}
return d[t];//d数组为s点到任意点的最短距离
}
;