dijkstra基础
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std; #define N 505
#define inf 0x3f3f3f3f int path[N];//输出路径 存放的是i的前一个点 path[j]=u;
int n,e,m,s;
int vis[N],dis[N],mp[N][N];
int city[N];//为权值 第一优先级为最短路 第二优先级为权值最或者最小 此为第二类权值(和点相连) 还有一种权值为和路相连 那种更简单
int peo[N];
int pathnum[N];//最短路的条数!!! 初始为1 只要在路径相同时累合即可 void dijkstra(int s)
{
memset(vis,,sizeof vis); for(int i=;i<n;i++)
dis[i]=mp[s][i];
dis[s]=; path[s]=-;
peo[s]=city[s];
pathnum[s]=; //明确规定不加vis[s] for(int i=;i<=n;i++)
{
int minn=inf,u=-;
for(int j=;j<n;j++)
if(!vis[j]&&minn>dis[j])
minn=dis[u=j]; if(u==-)return;
vis[u]=; for(int j=;j<n;j++)
{ if(dis[j]>dis[u]+mp[u][j])
{
// pathnum[j]=pathnum[u];//最短路条数
dis[j]=dis[u]+mp[u][j];
path[j]=u;
peo[j]=peo[u]+city[j];
}
else if(dis[j]==dis[u]+mp[u][j])
{
// pathnum[j]+=pathnum[u];//最短路条数
if(peo[j]<peo[u]+city[j])
{
path[j]=u;
peo[j]=peo[u]+city[j];
}
}
}
}
} void print(int x)
{
if(path[x]==-)
{printf("%d",x);return;}
print(path[x]);
printf(" %d",x);
return ;
} int main()
{
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=;i<n;i++)scanf("%d",&city[i]); for(int i=;i<n;i++)
for(int j=;j<n;j++)
mp[i][j]=inf;//如果加上 i==j 时mp为0 则可以反复刷权值 while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(mp[a][b]>c)mp[a][b]=mp[b][a]=c;
}
dijkstra(s);
printf("%d %d\n", pathnum[e] ,peo[e] );
print(e);
return ;
}
用堆优化
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f
#define N 3000
int head[N];
int pos;
struct node
{
int v,to,nex;
}edge[N<<];
void add(int a,int b,int c)
{
edge[++pos].nex=head[a];
head[a]=pos;
edge[pos].v=c;
edge[pos].to=b;
}
struct Node
{
int d,id; bool operator<(Node b)const
{
return d>b.d;
}
};
int n;
int dis[N],vis[N]; void dijkstra(int s)
{
rep(i,,n)
dis[i]=inf;
dis[s]=;
priority_queue<Node>q;
q.push(Node{,s});
while(!q.empty())
{
Node u=q.top();q.pop();
if(vis[u.id])continue;
vis[u.id]=;
for(int i=head[u.id];i;i=edge[i].nex)
{
int v=edge[i].to;
if(u.d+edge[i].v<dis[v])
{
dis[v]=u.d+edge[i].v;
q.push(Node{dis[v],v});
}
}
}
}
int main()
{
int m,s,t;
RII(n,m);RII(s,t);
while(m--)
{
int a,b,c;
RIII(a,b,c);
add(a,b,c);
add(b,a,c);
}
dijkstra(s);
cout<<dis[t]; return ;
}
dijkstra基础的更多相关文章
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- hdoj 1874 dijkstra
在做PAT的甲1003,思考DFS和图什么的,时间紧张直接去看柳神(日后上传柳神的C++版本)的订阅,得知是dijkstra,转去用hdoj 1874练手,写了两天,终于调出来了 题目链接:http: ...
- P4568 飞行路线 分层图最短路
P4568 飞行路线 分层图最短路 分层图最短路 问题模型 求最短路时,可有\(k\)次更改边权(减为0) 思路 在普通求\(Dijkstra\)基础上,\(dis[x][j]\)多开一维\(j\)以 ...
- 图论基础之Dijkstra算法的初探
图论,顾名思义就是有图有论. 图:由点"Vertex"和边"Edge "组成,且图分为有向图和无向图(本文讨论有向图),之前做毕业设计的 ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- 基础最短路(模板 dijkstra)
Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...
- 基础算法之Dijkstra最短路径
核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止. 设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径. S集合代表已经探索过的节点,U集合表示未探索过的节点. 时间复 ...
- NEU 1664 传送(最短路基础 堆优化Dijkstra)
题目描述 小A最近喜欢上一款游戏:游戏把地图分了一些区域,这些区域可能会重叠,也可能不会. 游戏中有一项传送技能,改传送技能只能将在同一区域的两个地方使用.小A可以利用区域中重叠部分来实现从某一区域到 ...
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
随机推荐
- 二、Internet地址结构
IP路由器实现的转发程序使用IP地址来识别流量去向.IP地址也表示流量来源. 2.1 IP地址的表示 IPV4地址通常采用点分四组或点分十进制表示法,如192.168.1.1. 点分四组表示法由四个用 ...
- CSS进阶之模拟Bootstrap网格布局
目前暂时实现效果,容后面整理心得,先贴上源代码. 源码 <!DOCTYPE html> <html> <head> <title>demo bootst ...
- 运维数据库平台~inception审核规则详解
---恢复内容开始--- 一 简介:这次我们来介绍最核心的审核功能 二 讲解:简单来说 inception就是mysql的二次过滤,何谓二次过滤,我们知道,mysql本身都有自己的审核规则,为业界所通 ...
- 列式数据库~clickhouse 底层存储原理
简介:今天介绍列式数据库的一些基本原理 一 数据目录 Data目录 数据存储目录,数据按照part分成多个文件夹,每个文件夹下存储相应数据和对应的元信息文件 Metadata 表定义语句,存储所有表 ...
- spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException
报错如下: The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcach ...
- Debian 安装配置(包括kdevelop)
最近几天折腾了一下Debian 7 (gnome桌面DVD版,KDE桌面CD版最后会提到),总的来说收获还是挺大的,对比以前使用ubuntu,debian 7给我的感觉像是一个新生婴儿,不带多余的花俏 ...
- 驱动开发--【字符设备、块设备简介】【sky原创】
驱动开发 字符设备,块设备,网络设备 字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问 EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...
- ActiveMQ 入门Nodejs版
ActiveMQ 入门下载与安装 官方下载地址 解压,运行bin/win[32|64]/activemq[.bat] 启动服务 环境信息 控制台: http://localhost:8161 默认端口 ...
- springboot系列十五、springboot集成PageHelper
一.介绍 项目中经常会遇到分页,PageHelper为我们解决了这个问题.本质上实现了Mybatis的拦截器,作了分页处理. 二.配置PageHelper 1.引入依赖 pagehelper-spri ...
- javascrip学习之 数据类型和变量
JavaScript 是脚本语言.是一种轻量级的编程语言.是可插入 HTML 页面的编程代码,可由所有的现代浏览器执行. JavaScript的语法和Java语言类似,每个语句以;结束,语句块用{.. ...