一在求最短路前我们来看看图的存储
1.邻接矩阵的建立:
int n,g[N][N];//n个点,对于g[x][y]表示起点x到终点y的边权(有向边)
g[x][y]=g[y][x]=z;//无向边的处理
g[x][y]=min(g[x][y],z);//重边的处理(最短路只保留最短的一条边即可)
2.邻接表的建立:
int head[N],ne[M],ver[M],edge[M],idx;
//邻接表的建立
void add(x,y,z)
{
idx++; ver[idx]=y,edge[idx]=z,ne[idx]=head[x],head[x]=idx;
}
//无向边的处理:
add(x,y,z),add(y,x,z)
x表示起点,y表示终点,z表示这条边的边权,N表示最大范围的点数,M表示最大边数,
add操作同数组模拟单链表类似,ver终点集合,head起点集合,ne指向下一个标号,edge表示边,它们通过同一个idx统一,
朴素Dijkstra算法(邻接矩阵存)
适用情况:求s号点到图中其他所有点的最短距离 O(n^2)
int d[N];//表示从某一点到当前距离是多少
bool v[N];//判断每个点的最短路是否已经确定了
算法步骤:
1.初始化将dist置为无穷大,v默认false,起点到自己的距离默认为0
2.进行n次循环,在每一次循环中都要确定s到一个还没有确定最短距离点的最短距离(那么n次循环就能确定n个点的最短距离)
即,先找到x<--找到不在st中的距离最近的点,再用这个点更新到其他点的距离
d[y]=min(d[y],d[x]+a[x][y]);//表示s到y的之前确定的距离和s到x再到y的距离的更小
现在我们来看看题目:
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值,求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1
输入:
第一行:n(1~500)和m(1~10000)
接下来m行 x,y,z:点x和点y间存在一条有向边,边长为z
输出:
一个整数,表示1号点到n号点的最短距离
若路径不存在,则输出-1
边长均不超过10000
3 3
1 2 2
2 3 1
1 3 4
3
#include<iostrea