一.最短路径问题
1.单源最短路径:
(1)迪杰斯特拉算法(Dijkstra),有权图的单源最短路径的模版
//path数组初始化为-1,dist数组初始化为正无穷
void Dijkstra(Vertex s)
{while(1){
V=未收录节点中dist最小者;
if(这样的V不存在)
break;
collected[V]=true;
for(V的每个邻接点W){
if(collected==false)
if(dist[w]+E<v,m><dist[w]){
dist[w]=dist[w]+E<v,m>;
path[w]=v;
}
}
}
}
(2)无权图的单源最短路径的模版
void Unweighted(Vertex S)
{
Enqueue(S,Q);
while(!IsEmpty(Q)){
v=Dequeue(Q);
for(V的每个邻接点W)
if(dist[w]==-1){
dist[W]=dist[V]+1;
path[W]=V
Enqueue(W,Q);
}
}
}
2.多源最短路径
弗洛伊德算法(Floyd)
模版:
bool Floyd(Graph Graph,WeightType D[][MaxVertexNum],Vertex path[][MaxVertexNum])
{
Vertex i,j,k;
for(i=0;i<Graph->Nv;i++)
for(j=0;j<Graph->Nv;j++)
{D[i][j]=Graph->G[i][j];
path[i][j]=-1;
}
for(k=0;k<Graph->Nv;k++)
for(i=0;i<Graph->Nv;i++)
for(j=0;k<Graph->Nv;j++)
if(D[i][k]+D[k][j]<D[i][j]){
D[i][j]=D[i][k]+D[k][j];
if(i==j&&D[i][j]<0)
return false;
path[i][j]=k;
}
return true;
}
例题:哈利·波特的考试
算法框架:图的创建+Floyd,每个顶点到其他顶点的最大值,再找出这些值中的最小值
#include <stdio.h>
#define MAXSIVE 100
#define INFINITY 65535
int G[MAXSIVE][MAXSIVE];
int Nv,Ne;
int main() {
//创建图
int i,j,k,m,n,w;
scanf("%d %d",&Nv,&Ne);
for(i=1;i<=Nv;i++)
for(j=1;j<=Nv;j++)
G[i][j]=INFINITY;//将两点间的距离初始化为正无穷大
for(i=0;i<Ne;i++)
{
scanf("%d %d %d",&m,&n,&w);
G[m][n]=w;
G[n][m]=w;
}
//多源路经的最短距离(floyd)
for(k=1;k<=Nv;k++)
for(i=1;i<=Nv;i++)
for(j=1;j<=Nv;j++)
if(G[i][k]+G[k][j]<G[i][j]){
G[i][j]=G[i][k]+G[k][j];
}
int MAX=INFINITY;
int in=0;
for(i=1;i<=Nv;i++)
{
int max=0;
for(j=1;j<=Nv;j++){
if(i==j)continue;
if(G[j][i]>max)
max=G[j][i];
}
if(max<MAX)
{
MAX=max;
in=i;
}
}
printf("%d %d\n",in,MAX);
return 0;
}
测试用例:6 11
3 4 70
1 2 1
5 4 50
2 6 50
5 6 60
1 3 70
4 6 60
3 6 80
5 1 100
2 4 60
5 2 80
4 70
Program ended with exit code: 0