Floyd:
#include <stdio.h>
const int INF = 0xfffffff;
#define maxn 310
int grap[maxn][maxn]; //邻接矩阵存储图
int n , m;
int dist[maxn][maxn]; //记录从所有点之间的最短距离
int min(int a,int b)
{
return a>b?b:a;
}
void init() // 对一些数据进行初始化
{
int i , j;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
grap[i][j] = (i==j?0:INF);
}
void floyd()
{
int i , j , k;
//初始化, 一开始每个点与点之间的路径长度 就等于grap中的长度
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
dist[i][j] = grap[i][j];
for(k = 0; k < n; k++)
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
if(k ==i || k == j)
continue;
dist[i][j] = min(dist[i][k] + dist[k][j],dist[i][j]);
}
}
int main()
{
while(scanf("%d %d" , &n , &m)!=EOF)
{
init();int i , x , y , z;
for(i = 0; i < m; i++) //对有向图进行存储
{
scanf("%d %d %d" , &x , &y , &z);
//对每一组输入数据取与原来数据比较,两点多条路取最小路
grap[x][y] = min(grap[x][y],z);
grap[y][x] = min(grap[y][x],z);
}
floyd();
int s,t;
scanf("%d %d",&s,&t);
if(dist[s][t]==INF)
printf("-1\n");
else
printf("%d\n",dist[s][t]);
}
return 0;
}
dijkstra:
#include <stdio.h>
int a[205][205]; //记录邻接矩阵
int dist[205]; //到每个点的最短路
int m,n; //m条路,n个点
const int INF=0xfffffff;
void init() //初始化数据
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=(i==j?0:INF);
}
void dijkstra(int u) //从第u个点开始走
{
int sign[205]={0}; //标记走过否
int x=u;
int i,j;
for(i=0;i<n;i++) //初始化到各点距离
dist[i]=a[x][i];
dist[x]=0; //到本身距离为0
sign[x]=1; //改点以走过
for(i=1;i<=n-2;i++)
{
int min=INF;
for(j=0;j<n;j++) //在为走过的点中取距离x最短的点
{
if(!sign[j] && min>dist[j])
{
min=dist[j];
x=j;
}
}
sign[x]=1; //标记,已走过
for(j=0;j<n;j++)//x以改变,更新dist[]值
{
if(!sign[j] && dist[x]+a[x][j]<dist[j] && a[x][j]<INF)
dist[j]=a[x][j]+dist[x];
}
}
}
int main()
{
int i;
while(scanf("%d %d",&n,&m)!=EOF)
{
init();
for(i=0;i<m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
if(z<a[x][y]) //取两点多条路最小路
a[x][y]=z;
if(z<a[y][x])
a[y][x]=z;
}
int s,t;
scanf("%d %d",&s,&t);
dijkstra(s);
if(dist[t]<2000000)
printf("%d\n",dist[t]);
else
printf("-1\n");
}
return 0;
}
Floyd与Dijkstra算法详解
本文深入探讨了Floyd和Dijkstra算法在解决最短路径问题中的应用,包括算法原理、实现步骤以及实例分析。
2695

被折叠的 条评论
为什么被折叠?



