Dijkstra算法模板

存图

int tot ;
int head[MAXN], nxt[MAXN], to[MAXN], w[MAXN] ;
void add_edge(int x, int y, int z)
{
  to[++tot] = y ;
  w[tot] = z ;
  nxt[tot] = head[x] ;
  head[x] = tot ;
}

Dijkstra(优先队列,不用重载运算符版本)

priority_queue<pii> q ;

void init()
{
	memset(dis, 0x3f, sizeof(dis)) ;
}

void dijstra(int x)
{
	init() ;
	dis[x] = 0 ;
	q.push(make_pair(0, x)) ;
	while(!q.empty())
	{
		int u = q.top().second ;
		q.pop() ;
		if(vis[u] == 1) continue ;
		vis[u] = 1 ;
		for(int i = head[u] ; i ; i = nxt[i] )
		{
			int v = to[i] ;
			if(dis[v] > dis[u] + w[i])
			{
				dis[v] = dis[u] + w[i] ;
				q.push(make_pair(-dis[v], v)) ;
			}
		}
	}
}

重载运算符版本


struct node
{
	int dis ;
	int pos ;
	bool operator  <(const node &s )const
	{
		return s.dis < dis ;
	}
};

priority_queue<node> q ;
int vis[MAXN] ;
int dis[MAXN] ;
int n ;
void Dijkstra(int x)
{
	for(int i = 1 ; i <= n ; i ++ ) dis[i] = 0x7fffffff ;
	dis[x] = 0 ;
	q.push((node){0, x}) ;
	while(!q.empty())
	{
		node tmp = q.top() ;
		q.pop() ;
		int u = tmp.pos ;
		// int d = tmp.dis ;
		if(vis[u] == 1) continue ;
		vis[u] = 1 ;
		for(int i = head[u] ; i ; i = nxt[i])
		{
			int v = to[i] ;
			if( dis[v] > dis[u] + w[i]) 
			{
				dis[v] = dis[u] + w[i] ;
				if(vis[v] == 0 )
				{
					q.push((node){dis[v], v}) ;
				}
			}
		}
	}
}
posted @ 2023-02-01 03:37  Lwen1243  阅读(52)  评论(0)    收藏  举报