floyed-多源点最短路径
主要运用与求任意两点最短路径,时间复杂度为O(
n
3
n^3
n3)
代码存档
#include<bits/stdc++.h>
using namespace std;
//求任意两点的最短路径长度
/*输入样例
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
输出样例
3.41
*/
int n,m;
int a[150][2];
double f[150][150];
//求两点之前的最短距离
void floyed()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&i!=k&&j!=k&&(f[i][k]+f[k][j])<f[i][j])
{
f[i][j]=f[i][k]+f[k][j];
}
}
}
}
}
void csh()
{
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
f[i][j]=DBL_MAX;
}
}
}
int main()
{
cin>>n;
//读取n个点的坐标
for(int i=1;i<=n;i++)
{
cin>>a[i][0]>>a[i][1];
}
cin>>m;//m条边
csh();//将f全部初始化为无限大
//求x与x2点之间的距离
for(int i=1;i<=m;i++)
{
int x,x2;
cin>>x>>x2;
f[x][x2]=f[x2][x]=sqrt(pow(double(a[x][0]-a[x2][0]),2)+pow(double(a[x][1]-a[x2][1]),2));
}
int x,x2;
cin>>x>>x2;
floyed();
printf("%.2lf\n",f[x][x2]);
return 0;
}
dijkstra-单源点最短路径
一个点到任意点的最短路径
代码存档
#include<bits/stdc++.h>
using namespace std;
int n,m;
int f[105][105];//边
int vis[105];//已经确定最短路径的点
int dis[105];//到该点的最短时间
void csh(int n)
{
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
f[i][j]=INT_MAX;
}
}
}
//求原点s到其他点的最短路径
void dijkstra(int s)
{
//初始化
for(int i=0;i<=n;i++)
{
dis[i]=INT_MAX;
vis[i]=0;
}
dis[1]=0;//令1点到1点为0
while(1)
{
int mini=0,min_=INT_MAX;
//从未确定最短路径的点中找出最小的点
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&min_>dis[i])
{
mini=i;//mini目前的白点
min_=dis[i];
}
}
//如果没有未确定的点,结束
if(mini==0) break;
vis[mini]=1;//标记
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[mini]+f[mini][i]&&i!=mini)
{
dis[i] = dis[mini]+f[mini][i];
}
}
}
}
int main()
{
//求标号1到标号n的路口最短的时间
while(cin>>n>>m&&n!=0)
{
csh(n);//将时间设为最大值
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
f[a][b]=f[b][a]=c;
}
dijkstra(1);//起点是一号点
cout<<dis[n]<<endl;
}
return 0;
}
参考视频