求调dijkstra堆优化模板
查看原帖
求调dijkstra堆优化模板
746930
NO_OI_NO_LIFE楼主2023/9/17 11:24
#include <bits/stdc++.h>
#include <queue>
#define ll long long
using namespace std;
ll n,m,head[20005],cnt,dist[20005];
bool vis[20005];

struct edge{
	ll to,nxt,wei;
}e[1234567];

void add(ll u,ll v,ll w){
	e[++cnt].to=v;
	e[cnt].wei=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}

struct node{
	int uuu,ddd;
	bool operator <(const node &rhs) const{
		return rhs.ddd<ddd;
	}
};

priority_queue<node> q;

void init_and_dijkstra(){
	for(int i=1;i<=n;i++)
		dist[i]=0x3f3f3f3f;
	dist[1]=0; 
	q.push((node){0,dist[1]});
	while(!q.empty()){
		node fro=q.top();
		q.pop();
		ll u=fro.uuu;
		ll d=fro.ddd;
		if(vis[u])
			continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].nxt){
			ll uu=e[i].to;
			if(vis[uu])
				continue;
			ll dd=e[i].wei;
			if(dist[uu]>dist[u]+dd){
				dist[uu]=dist[u]+dd;
				q.push((node){uu,dist[uu]});
			}
		}
	}
}

int main(){
	cin>>n>>m;
	ll a,b;
	cnt=0;
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		add(a,b,1);
		add(b,a,1);
	}
	init_and_dijkstra();
	for(int i=1;i<=n;i++) cout<<dist[i]<<" ";
	return 0;
}

2023/9/17 11:24
加载中...