Dijkstra使用邻接矩阵存储图对比于邻接表,会占据大量内存,但通常此类题目不会卡内存。
/**
* 邻接矩阵表示的有向图的Dijkstra(单源最短路径)算法
* 顶点节点编号默认范围为[0,N-1]!即N个顶点编号不允许取到N
*/
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define Max 20000 //最大点编号
int Map[Max][Max]; //图的邻接矩阵表示
int flag[Max]; //顶点访问标记
int ans[Max]; //记录各点到起点距离
int S,E; //起点终点
int N,M; //节点数和边数
void Dijkstra()
{
memset(flag,0,sizeof(flag));
memset(ans,0x3f,sizeof(ans));
ans[S]=0;
while(true)
{
int v=-1; //标记目前访问结点
for(int u=0;u<N;u++) //遍历所有顶点,找到当前 未访问过 且 离起点源最近 的节点
{
if(!flag[u]&&(v==-1||ans[u]<ans[v]))
v=u;
}
if(v==-1) return; //所有顶点都访问完成,则完成最短路径计算
flag[v]=1; //访问标记
for(int i=0;i<N;i++) //计算更新目前所有访问过顶点的最短路径,即比较 目前访问节点带来的路径 和 之前记录的最短路径
ans[i]=min(ans[i],ans[v]+Map[v][i]);
}
}
int main()
{
cin>>N>>M; //输入顶点数和边数
memset(Map,0x3f,sizeof(Map)); //初始化图
for(int i=1;i<=M;i++) //输入每条边
{
int u,v,cost;
cin>>u>>v>>cost;
if(cost<Map[u][v]) //考虑题目可能同边不同值,只取最短边
Map[u][v]=cost; //无向图的话再令Map[v][u]=cost即可
}
cin>>S>>E; //输入起点和终点,Dijkstra求的是单源最短路径
Dijkstra();
if(ans[E]==INF) //不能到达
cout<<"-1"<<endl;
else
cout<<ans[E]<<endl;
}