魔法效果——dijkstra+堆(邻接表存储)
dijkstra本身每次要for一遍,才能找出最小的节点,但用了堆之后,直接取出堆首就可以了。
但要注意的一点是,c++自带的stl里的priority_queue本身是先入大出的,而我们要求的是最小值,所以我们在push的时候是插入负数,这样就能保证是先入小出的了
代码如下:
各种定义:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAXN 300000
using namespace std;
int edge,n,m,u,a,b,c;
int head[MAXN],to[MAXN],next[MAXN],w[MAXN];
int used[MAXN];
struct data
{
int d,num;
friend bool operator<(const data &a,const data &b)
{
return a.d>b.d;
}
}dis[MAXN];
priority_queue<data>team; void build(int a,int b,int c) //建表
{
edge++;
next[edge]=head[a];
w[edge]=c;
to[edge]=b;
head[a]=edge;
}
主函数
scanf("%d%d",&n,&m);
    for(int i=;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        build(a,b,c);
    }
    for(int i=;i<=n;i++)
    {
        dis[i].d=0x7fffffff/;
        dis[i].num=i; //赋初始值
    }
//dijkstra+堆的主要代码
    dis[].d=;//把它的边做的最小
    team.push(dis[]);//插入这个节点
    while(!team.empty())//非空
    {
        data t=team.top();
        team.pop();
        int u=t.num;
        if(used[u])continue;
        used[u]=;
        for(int i=head[u];i;i=next[i])
    {
        if(dis[to[i]].d>dis[u].d+w[i])
        {
            dis[to[i]].d=dis[u].d+w[i];
            team.push(dis[to[i]]);
        }
    }
}
    if(dis[n].d!=0x7fffffff/)cout<<dis[n].d;
    else cout<<-; 
神奇吧,我也觉得很神奇!
据说这样写可以把时间降低到比spfa还要快,好厉害!!!(果然是魔法操作)
魔法效果——dijkstra+堆(邻接表存储)的更多相关文章
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
		题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ... 
- 图的邻接表存储表示(C)
		//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ... 
- 数据结构(11) -- 邻接表存储图的DFS和BFS
		/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ... 
- 邻接表存储图,DFS遍历图的java代码实现
		import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ... 
- 图的邻接表存储 c实现
		图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ... 
- PTA 邻接表存储图的广度优先遍历(20 分)
		6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ... 
- 数据结构之---C语言实现图的邻接表存储表示
		// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ... 
- PTA 邻接表存储图的广度优先遍历
		试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ... 
- HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)
		题目链接: 传送门 畅通工程续 Time Limit: 1000MS Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ... 
随机推荐
- django路由系统之反向生成url
			from niubin.service import v1 from django.urls import reverse from django.shortcuts import HttpRespo ... 
- python默认参数不能定义为可变对象类型
			python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ... 
- [不常用]  -  CSRF(跨站点请求伪造)
			CSRF,Cross Site Request Forgery,即跨站点请求伪造. 这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作. 比如:如果删除用户操 ... 
- iOS  学习如何声明私有变量和私有方法
			私有变量 首先来说 OC 中没有绝对的私有变量,这么说基于两点原因: 1可修改: 通过KVC 键值编码 来修改私有成员变量的值 2可读取 : 通过底层runtime 获取实例变量Ivar 对应 ... 
- SOA和微服务之间的区别
			近几年,我们有很多文章对SOA和微服务之间的不同点和相似点进行了分析.有些人认为SOA有很多地方是值得微服务学习的,而有些人则认为区别对待微服务和SOA会更好.而Neal Ford认为,将单体迁移到面 ... 
- 【leetcode刷提笔记】Search Insert Position
			Given a sorted array and a target value, return the index if the target is found. If not, return the ... 
- 【Head First Servlets and JSP】笔记12:URL重写
			1.会话管理的核心在于“交换会话ID”,来回传递cookie是最简单的方法,容器通过客户端发来的JSSESIONID查找匹配的对话. 2.如果浏览器禁用了cookie,那就意味着浏览器将忽略响应首部中 ... 
- iOS_SDWebImage框架分析
			SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.使用SDWebImage首先了解它加载图片的流程. 入口 setIma ... 
- 模型融合之blending和stacking
			1. blending 需要得到各个模型结果集的权重,然后再线性组合. """Kaggle competition: Predicting a Biological Re ... 
- HTML5 上传图片 到ASP.NET MVC
			@{ ViewBag.Title = "Home Page"; } <!DOCTYPE HTML PUBLIC> <html> <head> & ... 
