Aizu - ALDS1_12_C:Dijkstra +堆优化

本文深入探讨了Dijkstra算法的原理与应用,通过具体的代码示例,详细讲解了如何使用优先队列实现该算法,解决图论中的最短路径问题。文章涵盖了节点结构定义、边的表示、距离更新策略及优先队列操作等关键环节。

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,b,a) for(int i=b;i>a;i--)
using namespace std;
const int N=1e4+5;
const int INF=1<<25;
int n,u,v,w;
struct node{
	int v;
	int c;
	node (int _v=0,int _c=0):v(_v),c(_c){}//
	bool operator<(const node &r)const{
		return c>r.c;
	}
};//数越小优先级越高

struct Edge{
	int v,cost;
	Edge(int _v=0,int _cost=0):v(_v),cost(_cost){};
};//下一个结点和权值

vector<Edge>E[N];
bool vis[N];
int dist[N];
void Dijkstra(int n,int start){
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++) dist[i]=INF;
		priority_queue<node>que;
		while(!que.empty()) que.pop();//优先队列置空

		dist[start]=0;
		que.push(node(start,0));

		node tmp;
		while(!que.empty()){
			tmp=que.top();
			que.pop();

			int u=tmp.v;
			if(vis[u]) continue;

			vis[u]=true;
			for(int i=0;i<E[u].size();i++){
				int v=E[u][i].v;
				int cost =E[u][i].cost;
				if(!vis[v]&&dist[u]+cost<dist[v]){//判断直接和绕过另一个那个进
					dist[v]=dist[u]+cost;
					que.push(node(v,dist[v]));
				}
			}
		}
}
int main(){
	int n,k;
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>u>>k;
		per(i,0,k){
			cin>>v>>w;
			E[u].push_back(Edge(v,w));
		}
	}
	Dijkstra(n,0);
	for(int i=0;i<n;i++)
        cout<<i<<" "<<dist[i]<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值