您的位置:首页 > 其它

最短路--dijkstra+优先队列优化模板

2015-04-24 20:10 429 查看
不写普通模板了,还是需要优先队列优化的昂

#include<stdio.h>        //基本需要的头文件
#include<string.h>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;

const int maxn=1e5+5;
const int maxm=1e5+5;

int head[maxn],nxt[maxm<<1],val[maxm<<1],point[maxm<<1],size;
int dis[maxn];

void init(){
memset(head,-1,sizeof(head));
size=0;
}

void add(int a,int b,int v){    //若有向图则只需要前一半
point[size]=b;
val[size]=v;
nxt[size]=head[a];
head[a]=size++;

point[sise]=a;
val[size]=v;
nxt[size]=head[b];
head[b]=size++;
}

struct cmp{                        //将优先队列改为小根堆
bool operator()(pii a,pii b){
return a.first>b.first;
}
};

void dij(int s,int t){            //传入出发点和到达点
int i;
priority_queue<pii,vector<pii>,cmp>q;
q.push(make_pair(0,s));
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
while(!q.empty()){
pii u=q.top();
q.pop();
if(u.first>dis[u.second])continue;
for(i=head[u.second];~i;i=nxt[i]){
int j=point[i];
if(dis[j]>u.first+val[i]){
dis[j]=u.first+val[i];
q.push(make_pair(dis[j],j));
}
}
}
printf("%d\n",dis[t]);        //或去掉在主函数中输出或操作
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: