/***************************
//邻接矩阵版dijkstra算法
***************************/
#define INF 0x3F3F3F3F //把INF(最大值)设置成0x3f3f3f3f
const int MAXN = 1010; //所开数组大小可以修改,一般情况1010足够
int G[MAXN][MAXN]; //G[a][b]表示a,b的权值,G[][]二维数组为构建的邻接矩阵
int vis[MAXN]; //vis[a]记录是否已经查看过'a'点vis[a] == 1 表示已经查看过改点
int dis[MAXN]; //dis[a]记录从起点到'a'点之间的最短路径
//初始化函数,应该在加第一条边之前进行初始化
void init(int n){//n表示gongyoun个点
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
G[i][j] = INF; //初始时假设各不连通,G[i][j]设置为INF 注:把INF 设置成 0x3f3f3f3f
}
}
//加边处理,加第一条边前初始化,加边完成后再进入dijksrea函数
void add_edge(int u,int v,int d){
G[u][v] = min(G[u][v],d); //更新u,v边上的权值,并将权值最小的存入G[u][v]||不是最新的值而是最小的
}
//上面的工作是为了构建图init()为初始化图
// dijkstra算法函数 至此前期工作必须已经完成,开始求从某点出发的最短路径
void dijkstra(int s,int n){ //s 表示从s点出发的最短路径
//初始化vis[],dis[],不可以放到init()函数中,当需要在一张图中求从多点出发时,需多次跑dij,每次跑都需要对dis,vis数组初始化
for(int i;i<n;i++)
{
vis[i] = 0; //初始化vis数组,因为全部未查看,全部置零
i == s?dis[i] = 0:dis[i] = INF;//初始化dis数组,除S本身外其他点未知,置为INF,s点本身距s为0
}
for(int i = 0;i<n;i++){ //遍历全部点
int x,minn = INF;
for(int j = 0;j<n;j++){
if(!vis[j]&&dis[j]<=minn){//如果J点未被查看,同时s到j的距离比最小值小时进入判断
x = j; //x用来记录距离最短的节点
minn = dis[j]; //记录最小距离
}
} //n次循环后必定找到一个满足条件的最小的j和最小的dis[j];
vis[x] = 1;
//将这个点从上一个for中去掉,那么n次大循环后所有点的vis置为1
for(int j=0;j<n;j++){
int y = j;
dis[y] = min(dis[y], dis[x] + G[x][y]);//利用这最小的一点更新所有其他点比较看直接s到y权值小,还是经由x到y权值小。取小值
最短路径(Dijkstra模板)
于 2022-04-07 09:18:51 首次发布