dijkstra算法

对dijkstra算法的一些理解 。

struct edge{
	int to,cost;//定义边的目的地与距离 
};
typedef pair<int ,int >P;//定义pair为P; 
int V;
int d[MAX_V];
vector<edge>G[M];//起始点m到to点的权值即G[M].[i]=e;e.to,e.cost;
void dijkstra(int s){
	priority_queue<P,vector<P>,greater<P>>que;//优先队列从小到大排可以对最小元素取出删除; 
	fill(d,d+n,INF);
	d[s]=0;
	que.push(P(0,s));//把起始点入队 
	while(!que.empty()){
		P p=que.top();
		que.pop();
		int v=p.second;
		if(d[v]<p.first){
			continue;//为了防止同一目的地,进入队列时先大后小的进入,减小复杂度,相当于截枝吧 
		}
		for(int i=0;i<G[v].size();i++){//通过上面把最小顶点确定,继续更新其余点; 
			edge e=G[v][i];//为了方便写与确定的点的其余点的关系; 
			if(d[e.to]>d[v]+e.cost){
				d[e.to]=d[v]+e.cost;//找到更新的点 
				que.push+(P(d[e.to],e.to));//把这些点压入队列(压入的点不一定最小距离只是把比原来的值小放入而已,所以对应上面的截枝) 
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值