#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基础的更多相关文章

  1. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  2. hdoj 1874 dijkstra

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

  3. P4568 飞行路线 分层图最短路

    P4568 飞行路线 分层图最短路 分层图最短路 问题模型 求最短路时,可有\(k\)次更改边权(减为0) 思路 在普通求\(Dijkstra\)基础上,\(dis[x][j]\)多开一维\(j\)以 ...

  4. 图论基础之Dijkstra算法的初探

         图论,顾名思义就是有图有论.        图:由点"Vertex"和边"Edge "组成,且图分为有向图和无向图(本文讨论有向图),之前做毕业设计的 ...

  5. 【算法设计与分析基础】25、单起点最短路径的dijkstra算法

    首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...

  6. 基础最短路(模板 dijkstra)

    Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...

  7. 基础算法之Dijkstra最短路径

    核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止. 设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径. S集合代表已经探索过的节点,U集合表示未探索过的节点. 时间复 ...

  8. NEU 1664 传送(最短路基础 堆优化Dijkstra)

    题目描述 小A最近喜欢上一款游戏:游戏把地图分了一些区域,这些区域可能会重叠,也可能不会. 游戏中有一项传送技能,改传送技能只能将在同一区域的两个地方使用.小A可以利用区域中重叠部分来实现从某一区域到 ...

  9. 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

随机推荐

  1. C# 与 SQL Server 的数据类型对应关系

    (一)C#与SQL Server 2005(或以下版本): C# C#取值 SQL Server SQL Server取值 System.DateTime samlltime System.Objec ...

  2. MAC洪水攻击

    MAC洪水攻击原理 传统的交换机在数据转发过程中依靠对CAM表的查询来确定正确的转发接口,一旦在查询过程中无法找到相关的目的MAC对应的条目,此数据帧将作为广播帧来处理,CAM表的容量有限,只能存储不 ...

  3. JavaSE之Math类

    下列哪个选项是正确计算42度(角度)的余弦值? double d=Math.cos(42) double d=Math.cosine(42) double d=Math.cos(Math.toRadi ...

  4. [ZJOI2012]波浪弱化版(带技巧的DP)

    题面 \(solution:\) 这道确实挺难的,情况特别多,而且考场上都没想到如何设置状态.感觉怎么设状态不能很好的表示当前情况并转移,考后发现是对全排列的构造方式不熟而导致的,而这一题的状态也是根 ...

  5. sqlite limit offset

    limit 0,20 表示从第1条开始取20条数据 limit 20 offset 2  表示从第2条开始取出20条数据

  6. ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)

    题目链接: https://nanti.jisuanke.com/t/31001 超时代码: #include<bits/stdc++.h> using namespace std; # ...

  7. layer弹出层的iframe页面回调

    $("#ChoiceBank").click(function () { var width = $("#content").css("Width&q ...

  8. 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践

    2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...

  9. R-CNN论文详解(转载)

    这几天在看<Rich feature hierarchies for accurate object detection and semantic segmentation >,觉得作者的 ...

  10. linux 同步IO: sync、fsync与fdatasync、sys_sync【转】

    本文转自:http://blog.csdn.net/cywosp/article/details/8767327 和 http://www.2cto.com/os/201204/126687.html ...