问题对象
全源最短路问题。
即 对给定的图(V,E),求任意两点u,v之间的最短路径长度(时间复杂度为O(n3),所以顶点数n小于200)
实现方法
邻接矩阵
基本思想
若存在 dis[i][k] + dis[k][j]<dis[i][j] 则令 dis[i][j]=dis[i][k] + dis[k][j]
算法流程
枚举顶点k∈ [1 , n]
以顶点K作为中介点,枚举所有顶点对i和j(i∈ [1 , n] j∈ [1 , n])
若存在 dis[i][k] + dis[k][j]<dis[i][j]
则令 dis[i][j]=dis[i][k] + dis[k][j]
eg.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxv=200;//最大顶点数
const int INF=1000000000;//无穷大
int n,m;//顶点数 边数
int dis[maxv][maxv];//记录权重
void Floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][k]!=INF&&dis[k][j]!=INF&&dis[i][k]+dis[k][j]<dis[i][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<=n;i++)
{
dis[i][i]=0;//自身到自身距离为0
}
while(n!=0||m!=0)
{
fill(dis[0],dis[0]+maxv*maxv,INF);//初始化
int a,b,c;
for(int i=0;i<m;i++)
{
cin>>a>>b>>c;
dis[a][b]=c;
dis[b][a]=c;
}
Floyd();
cout<<dis[1][n]<<endl;
cin>>n>>m;
}
return 0;
}