dijkstra算法的优化

优化的核心思想在于找到当前最短的一个节点。使用set模拟一个小根堆可优化(比priority_queue效率高一些)。

#include
using namespace std;
const int N=1010; const int M=5010; const int INF=0x7ffff;
int n,m,a,b,c,cnt,head[N],dis[N];//dij不需要vis 
struct Way{
	int to,next,val;
} way[M<<1];
struct cmp{
	bool operator()(const int &a,const int &b){
		if(dis[a]!=dis[b]) return dis[a]s;//set模拟一个小根堆 
void add(int u,int v,int w){
	way[++cnt].to=v;
	way[cnt].val=w;
	way[cnt].next=head[u];
	head[u]=cnt;
}
void dijkstra(int st){
	for(int i=1;i<=n;i++) dis[i]=INF;
	dis[st]=0; s.insert(st);
	for(int i=1;i<=n;i++){
		if(s.size()==0) break;//没有说明有的点不能到达,算法结束 
		int cur=*s.begin(); s.erase(cur);
		for(int j=head[cur];j;j=way[j].next)
			if(dis[way[j].to]>dis[cur]+way[j].val){//先删去集合中的元素再插入新的
				s.erase(way[j].to);
				dis[way[j].to]=dis[cur]+way[j].val;
				s.insert(way[j].to);
			}
	}
	printf("%d",dis[n]);
}
int main(){
	freopen("data.in","r",stdin);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&a,&b,&c);
		add(a,b,c); add(b,a,c);
	}
	dijkstra(1);
	return 0;
}

你可能感兴趣的:(dijkstra算法的优化)