首页 > 其他 > 详细

dijikstra 堆优化

时间:2020-10-25 18:56:06      阅读:29      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
const int INF=1<<30;
int n,m;
int head[maxn],dis[maxn],cnt;
bool vis[maxn];

struct qwq{
	int from,to,next;
	int len;
}edge[maxn*2];

struct Node{
	int id,dist;
	bool operator < (const Node &x)const{
		return dist>x.dist;
	}
};

priority_queue<Node> q;

void add(int u,int v,int w){
	cnt++;
	edge[cnt].from=u;
	edge[cnt].to=v;
	edge[cnt].len=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
	return;
}

void Dijikstra(int s){
	for(int i=1;i<=n;i++)dis[i]=INF,vis[i]=0;
	dis[s]=0;
	q.push(Node{s,0});
	while(!q.empty()){
		Node x=q.top(); q.pop();
		int u=x.id;
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].next){
			if(dis[edge[i].to]>dis[edge[i].from]+edge[i].len){
				dis[edge[i].to]=dis[edge[i].from]+edge[i].len;
				q.push(Node{edge[i].to,dis[edge[i].to]});
			}
		}
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		static int u,v;
		scanf("%d%d",&u,&v);
		add(u,v,1);
		add(v,u,1);
	}
	int Q;
	scanf("%d",&Q);
	for(int i=1;i<=Q;i++){
		static int s,t;
		scanf("%d%d",&s,&t);
		Dijikstra(s);
		printf("%d\n",dis[t]);
	}
	return 0;
} 

  

dijikstra 堆优化

原文:https://www.cnblogs.com/codetogether/p/13874215.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!