求助,手写堆+Dijkstra,RE 9个点
查看原帖
求助,手写堆+Dijkstra,RE 9个点
431658
冷却心月明かり楼主2022/6/12 18:17
#include<bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<int,int> PII;
int n,m,Q,visit[500005],d[500005],size=0;
vector<PII> g[500005]; 
PII heap[500005];
void push(PII x){
	heap[++size]=x;
	int now=size;
	while(now>1){
		int father=now/2;
		if(heap[father]>=heap[now])swap(heap[father],heap[now]);
		else break;
		now=father;
	}
	return ;
}
void pop(){
	swap(heap[1],heap[size]);
	size--;
	int now=1;
	while(now*2<=size){
		int next=now*2;
		if(next+1<=size&&heap[next+1]<heap[next])next++;
		if(heap[next]<heap[now])swap(heap[next],heap[now]);
		else break;
		now=next;
	}
	return ;
}
PII top(){
	return heap[1];
}
void Dijkstra(int st){
	memset(visit,0,sizeof(visit));
	memset(d,0x3f,sizeof(d));
	size=0;
	int cnt=0;
	d[st]=0;
	push(make_pair(0,st));
	while(cnt<n){
		int u=top().second;pop();
		if(visit[u])continue;
		cnt++;
		visit[u]=1;
		for(auto it:g[u]){
			int v=it.first,w=it.second;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				push(make_pair(v,d[v]));
			}
		}
	}
	return ;
}
int main(){
	scanf("%d%d%d",&n,&m,&Q);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back(make_pair(v,w));
		g[v].push_back(make_pair(u,w));
	}
	int l,r;
	Dijkstra(1);
	for(int i=1;i<=Q;i++){
		scanf("%d%d",&l,&r);
		printf("%d\n",d[l]+d[r]);
	}
	return 0;
}

2022/6/12 18:17
加载中...