• 克鲁斯卡尔算法(Kruskal算法)
  • 用并查集排除环

数据结构(知识点碎片三十四)_最短路径

  • 相关存储结构

数据结构(知识点碎片三十四)_存储结构_02

typedef struct
{
int a,b;
int w;
}Road;
Road road[maxSize];

int getRoot(int p)
{
while(p!=v[p])
p=v[p];
return p;
}

void Kruskal(Road road[],int n, int e, int &sum)
{
int a, b; 
sum = 0;
for(int i = 0; i< n; ++i)
v[i] = i;
sort(road, e);  //把边的数组按照权值从小到大排序
for(int i = 0; i<e; ++i)
a = getRoot(road[i].a); 
b = getRoot(road[i].b); 
if(a != b)
{
v[a] = b;
sum += road[i].w;
}
}
}

2. 最短路径

  • 迪杰斯特拉算法(Dijkstra)

数据结构(知识点碎片三十四)_存储结构_03

若dist[v]比dist[Vpre]+MGraph[Vpre][v]大则:

更新 dist[v] 为 dist[Vpre]+MGraph[Vpre][v];更新 path[v] 为 Vpre。

数据结构(知识点碎片三十四)_存储结构_04

void Dijkstra(int n, float MGraph[][n], int v0,int dist[l, int path[])
{
int set[maxSize]; int min, v;
for(int i=0;i<n;++i)
{
dist[i]=MGraph[v0][i]; 
set[i]=0;
if(MGraph[v0][i]<INF) 
path[i]=v0; 
else
path[i]=-1;
}
set[v0]=1;path[v0]=-1; 
for(int i=0;i<n-1;++i)
{
min=INF;
for(int j=0;j<n;++j)
if(set[j]==0&&dist[j]<min)
{
v=j;
min=dist[j];
}
set[v]=1;
for(int j=0;j<n;++j)
{
if(set[j]==0&&dist[v]+MGraph[v][j]<dist[j])
{
dist[j]=dist[v]+MGraph[v][j]; 
path[j]=v;
}
}
}
}

数据结构(知识点碎片三十四)_存储结构_05