http://acm.hdu.edu.cn/showproblem.php?pid=2544
题意描述:A,B为路口编号,C为AB之间的权值,计算最短路
Floyd方法
#include <stdio.h>
#include <cstring>
#include <string.h>
#include <iostream>
using namespace std;
#define inf 0x3f3f3f3f
int map[110][110];
int main()
{
int n,m;
int x,y,z;
int k,i,j;
while(cin>>n>>m &&n&&m)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j] = inf;
}
}
//输入a,b,c,并赋值路径长度
for(i=1; i<=m; i++)
{
cin>>x>>y>>z;
if(map[x][y]>z)
map[x][y] = map[y][x] =z;
}
//Floyd 模板
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
map[i][j] = min(map[i][j],map[i][k]+map[k][j]);
}
cout<<map[1][n]<<endl;
}
return 0;
}
Dijstra方法
/*Dijstra相对于Floyd效率还是高了很多的,它的主题思想为
从源点出发,找距离它最短的一个点,再以这个点为跳板,找离跳板最近的点
当不能继续进行时,再次回到源点,找第二小的点,重复操作,直到所有的点
都被访问过为止,注意,每个点只能访问一次,不然会和Floyd一样复杂*/
#include<cstdio>
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int a[105][105];
//dis为原点到当前点的距离,vis表示访问状态
int dis[105],vis[105];
int n,m;
void dijkstra(int x)
{
int i,j,k;
for(i=1; i<=n; i++)
{
dis[i] = a[x][i];//对dis初始化
}
memset(vis,0,sizeof(vis));//0表示没有被访问,1表示访问过
vis[x] = 1;
for(i=1; i<n; i++)//循环遍数,最多访问n-1次
{
int mix = inf;
int flag;
for(j=1; j<=n; j++)
{
if(vis[j] ==0&&mix>dis[j])//i=1时找的是离1最近的点,i=2时找的是第二近的点……
{
mix=dis[j];//记录下没有被访问,并且最近的点
flag=j;//标记这个最近的点
}
}
vis[flag] = 1;//标记已经被访问
for(k=1; k<=n; k++)
{
if(vis[k]==0&&dis[k]>dis[flag]+a[flag][k])
dis[k] = dis[flag]+a[flag][k];//以该点为跳板
}
}
}
int main()
{
int i,j,k;
int x,y,z;
while(cin>>n>>m && n||m)
{
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(j==i)
a[i][j]=0;
else
a[i][j]=inf;
}
while(m--)
{
cin>>x>>y>>z;
if(a[x][y]>z)
a[x][y]=a[y][x]=z;//无向图
}
dijkstra(1);
cout<<dis[n]<<endl;
}
return 0;
}

本文详细介绍了两种经典的最短路径算法:Floyd算法和Dijkstra算法。通过具体实例,展示了如何使用这两种算法来解决给定节点间的最短路径问题。Floyd算法适用于所有节点对的最短路径计算,而Dijkstra算法则更适用于单源最短路径问题,具有更高的效率。
1540

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



