hdu 1874 dijkstra 队列实现 比数组高效特别在稀疏图

参考  http://blog.csdn.net/zhuyingqingfen/article/details/6370561

刘汝佳白皮书

#include<stdio.h>
#include<queue>
#include<iostream>
#include<vector>
using namespace std;
#define N 2100
#define inf  1000000000
int n,m;
struct node {
int u,v,w,next;
}bian[N];
int yong,head[N];
void creat(int u,int v,int w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void  Dcreat(int u,int v,int w) {
creat(u,v,w);
creat(v,u,w);
}
int dijkstra(int u,int end) {
int dis[N],i,j,visit[N];
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++)
dis[i]=inf;
dis[u]=0;
     typedef pair<int ,int >p;//pair 定义了自己的排序规则--先比较第一维,相等才比较第二维 
priority_queue<p,vector<p>,greater<p> >q;
q.push(make_pair(dis[u],u));
while(!q.empty()) {
p cur=q.top();
j=cur.second;
q.pop();
if(visit[j])continue;
visit[j]=1;
for(i=head[j];i!=-1;i=bian[i].next) 
if(dis[bian[i].v]>dis[j]+bian[i].w) {
dis[bian[i].v]=dis[j]+bian[i].w;
q.push(make_pair(dis[bian[i].v],bian[i].v));
}
}

if(dis[end]<inf)
return dis[end];
return -1;
}
int main() {
int  i,j,a,b;
while(scanf("%d%d",&n,&m)!=EOF) {
yong=0;
memset(head,-1,sizeof(head));
while(m--) {
scanf("%d%d%d",&a,&b,&j);
Dcreat(a,b,j);
}
scanf("%d%d",&a,&b);
printf("%d ",dijkstra(a,b));
}
return 0;
}


//定义结构体优先队列

#include<stdio.h>
#include<queue>
#include<iostream>
#include<vector>
using namespace std;
#define N 2100
#define inf  1000000000
int n,m;
struct node {
int u,v,w,next;
}bian[N];
int yong,head[N];
void creat(int u,int v,int w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void  Dcreat(int u,int v,int w) {
creat(u,v,w);
creat(v,u,w);
}
struct nodee {
int len,v;
friend bool  operator<(nodee a,nodee b) {
if(a.len!=b.len)
return a.len>b.len;
return a.v>b.v;
}
};
int dijkstra(int u,int end) {
int dis[N],i,j,visit[N];
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++)
dis[i]=inf;
dis[u]=0;
     //typedef pair<int ,int >p;
//priority_queue<p,vector<p>,greater<p> >q;
// q.push(make_pair(dis[u],u));
priority_queue<nodee>q;
nodee cur,now;
cur.len=0;
cur.v=u;
q.push(cur);
while(!q.empty()) {
nodee cur=q.top();
// j=cur.second;
q.pop();
if(visit[cur.v])continue;
visit[cur.v]=1;
for(i=head[cur.v];i!=-1;i=bian[i].next) 
if(dis[bian[i].v]>dis[cur.v]+bian[i].w) {
dis[bian[i].v]=dis[cur.v]+bian[i].w;
now.len=dis[bian[i].v];
now.v=bian[i].v;
q.push(now);
}
}

if(dis[end]<inf)
return dis[end];
return -1;
}
int main() {
int  i,j,a,b;
while(scanf("%d%d",&n,&m)!=EOF) {
yong=0;
memset(head,-1,sizeof(head));
while(m--) {
scanf("%d%d%d",&a,&b,&j);
Dcreat(a,b,j);
}
scanf("%d%d",&a,&b);
printf("%d ",dijkstra(a,b));
}
return 0;
}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410864.html