#include<iostream>
using namespace std;
int edgs[100][100]; //边
int dist[MAXNUM]; //v0到各边的值
int prev[MAXNUM]; //前驱数组
void Dijkstra(int v0,int n)
{
bool S[MAXNUM]; //确定顶点是否在S集合中
for(int i=0;i<n;i++)
{
dist[i]=edgs[v0][i]; //vo到个点的初值
S[i]=false; //所有节点未加入S
if(dist[i] ==MAXINT)
{
prev[i]=-1; //没有前驱节点
}
else
prev[i]=v0;
}
dist[v0] =0;
S[v0]=true;
/*
求v到v0的最短距离,将v加到S集中
*/
for(int i=1;i<n;i++)
{
int min =MAXINT;
int u=v0;
//找到当前未使用点的DISJ[i]最小值
for(int j=0;j<n;j++)
{
if((!S[j]) && dist[j]<min)
{
u=j;
min=dist[j];
}
S[u]=true; //找到最短路径 加入顶点
//以新加入的节点 更新从 v0触发到集合V-S的顶点路径长度
for(int j=0;j<n;j++)
if((!S[j]) && dist[u]+edgs[u][j]<dist[j]) //通过新加入节点找到更短路径
{
dist[j]=dist[u]+edgs[u][j];
prev[j]=u; //更新前驱节点
}
}
}
}
int main()
{
int n; //图的顶点数
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>edgs[i][j]; //边的权值
return 0;
}
最短路算法(dijkstra)
最新推荐文章于 2023-02-09 09:13:27 发布