一二三四五 上山打老虎

两点间最短路模板Dijkstra

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点到任意点的最短距离
}
;
posted @ 2022-03-13 16:05  abestxun  阅读(27)  评论(0编辑  收藏  举报