参考  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\n",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\n",dijkstra(a,b));

}

return 0;

}

hdu 1874 dijkstra 队列实现 比数组高效特别在稀疏图的更多相关文章

  1. hdu 1874 Dijkstra算法

    先贴个网上找的比较通俗易懂的教程: 2.1Dijkstra算法(非负权,使用于有向图和无向图) Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心 ...

  2. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  3. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

  4. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  5. HDU 1874 畅通工程续(初涉dijkstra算法实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biye ...

  6. hdu 2544 hdu 1874 poj 2387 Dijkstra 模板题

    hdu 2544  求点1到点n的最短路  无向图 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 ...

  7. HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...

  8. hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. hdoj 1874 dijkstra

    在做PAT的甲1003,思考DFS和图什么的,时间紧张直接去看柳神(日后上传柳神的C++版本)的订阅,得知是dijkstra,转去用hdoj 1874练手,写了两天,终于调出来了 题目链接:http: ...

随机推荐

  1. bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4127  Solved: 1981[Submit][Sta ...

  2. ACM_四数之和

    四数之和 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个不同的整数,判断能否从中选4次,4个数和刚好为m.数字可重复选取. ...

  3. Windows Server 2008 R2关闭FTP服务

    公司在ZJ的项目给了一台互联网可以访问的测试服务器,但是只给了三个访问端口,而且还做了映射. 映射信息如下:[1050->3389,1051->50000,1053->21] 其中1 ...

  4. pycharm但多行注释快捷键

    pycharm中同时注释多行代码快捷键: 代码选中的条件下,同时按住 Ctrl+/,被选中行被注释,再次按下Ctrl+/,注释被取消

  5. Http协议对格式、请求头、方法

    ######### #概览 ######### 超文本传输协议(Http: Hyper Text Transfer Protocol) :用于发送WWW方式的数据.采用TCP/IP协议,是一个无状态协 ...

  6. 287 Find the Duplicate Number 寻找重复数

    一个长度为 n + 1 的整形数组,其中的数字都在 1 到 n 之间,包括 1 和 n ,可知至少有一个重复的数字存在.假设只有一个数字重复,找出这个重复的数字.注意:    不能更改数组内容(假设数 ...

  7. hdu5122 K.Bro Sorting

    思路: 模拟. 实现: #include <iostream> #include <cstdio> using namespace std; ], n, t; int main ...

  8. ElasticSearch学习笔记--一些规范,会持续更新

    我们在ElasticSearch中存储的数据一般是采用json的格式存储,所以ElasticSearch中有一个叫Mapper的东西用来定义jsonschema来规范这个json 但是这个mapper ...

  9. 【译】x86程序员手册26-7.5任务切换

    7.5 Task Switching 任务切换 The 80386 switches execution to another task in any of four cases: 80386在以下四 ...

  10. 如何实现ADSL宽带用户开机自动拨号与定时拨号

    在宽带拨号网络的环境下,要通过手动拨号认证才能上网.下面给大家介绍怎么设置开机自动拨号上网以及定时拨号上网. 这也是为一个叫CHY的2B准备的技术套餐,不需要用到网上说的自动拨号软件,只要在主机上设置 ...