#include <iostream>
using namespace std;
#define NUM 100
#define MAXINT 10000
// 单源最短路径的贪心算法
//顶点个数n,源点v,有向图的临接矩阵为c
//数组dist保存从源点v到每个顶点的最短特殊路径长度
//数组prev保存每个顶点在最短特殊路径上的前一个节点
void dijkstra(int n,int v,int dist[],int prev[],int c[][NUM])
{
int i,j;
bool s[NUM]; //集合s
for(int i=1;i<=n;i++)
{
dist[i]=c[v][i];
s[i]=false;
if(dist[i]>MAXINT)
prev[i]=0;
else
prev[i]=v; //初始化为源点
}
//初始化源节点
dist[v]=0;
s[v]=true;
for(int i=1;i<n;i++) //其余n-1 个顶点
{
//在数组中寻找未处理节点的最小值
int temp=MAXINT;
int u=v;
for(int j=1;j<=n;j++)
{
if(!(s[j])&&(dist[j]<temp)) //如果j节点没有在s中并且j和v有连线
{
u=j;
temp=dist[j];
}
}
s[u]=1; //找到其中离v最近的点并将其加入s中
//利用节点u来更新数组dist
for(int j=1;j<=n;j++)
{
//newdist 为从源点到该点的最短特殊路径
int newdist=dist[u]+c[u][j]; //即 newdist=c[v][u]+c[u][j];
if(newdist<dist[j])
{
//修正最短路径
dist[j]=newdist;
//记录j的前一个节点
prev[j]=u;
} //更新后,原来不直接相连的两个点(即距离为INFINITY的点)变为newdist
}
}
}
//从源点v1到其他n-1个节点的路径,根据数组prev打印出结果
void printTrace()
{
for(int i=2;i<=n;i++)
{
printf("%d",i);
int t=prev[i];
while(t!=1)
{
printf("<<<<<<%d",t);
t=prev[t];
}
printf("<<<<<1\n");
}
}
关于图的邻接矩阵,其实就是图的一种表示方法,数据结构而已
单源最短路径----------Dijkstra算法
最新推荐文章于 2020-06-29 22:19:02 发布