http://acm.hdu.edu.cn/showproblem.php?pid=2544
最短路的最简单的题目 入门题目 直接套模板就可以 给出Dijkstra算法和Floyd算法的代码 学习这两个算法可以从这个题目开始
Dijkstra算法:
#include <stdio.h>
const int maxinf=9999999;
int dist[110];//已求得的最短距离
int A[110][110];//用于记录各个点之间的距离
void Dijkstra(int v0,int n){
int S[110];//标记已经求得最短距离的点
int u;
for (int i=1;i<=n;i++)
{
dist[i]=A[v0][i];//将各点到源点得距离初始化 有边即为距离 无边为 maxinf
S[i]=0;//将所有得点初始化为未求得最短距离
}
dist[v0]=0; //源点到源点得距离为 0
S[v0]=1;//标记源点被计算过
for (int i=1;i<=n;i++)
{
int mindist=maxinf;
for (int j=1;j<=n;j++)
{
if (!S[j]&&dist[j]<mindist)// 找到未被计算过并且距离源点距离最短的点
{
u=j;
mindist=dist[j];
}
}
S[u]=1;//将该点标记为已被计算
for (int j=1;j<=n;j++)
{
if (!S[j]&&A[u][j]+dist[u]<dist[j])//从u的基础上 找到一个未被访问 距离源点最近的点
{
dist[j]=dist[u]+A[u][j];//保存该点最短距离
}
}
}
}
int main (){
int N,M;
int a,b,c;
while (scanf ("%d%d",&N,&M)&&(N||M))
{
for (int i=1;i<=N;i++)
{
for (int j=1;j<=N;j++)
{
A[i][j]=maxinf;//将各个点之间的距离初始化为 无穷大(表示为 maxinf)
}
}
for (int i=1;i<=M;i++)
{
scanf ("%d%d%d",&a,&b,&c);
//为两点之间付距离
A[a][b]=c;
A[b][a]=c;
}
Dijkstra(1,N);
printf ("%d\n",dist[N]);
}
return 0;
}
Floyd算法代码:
#include <stdio.h>
int maxinf=9999999;
int N,M;
int map[110][110];//邻接矩阵存储数据
int dis[110][110];//用于记录最短路
void floyd(){
for (int i=1;i<=N;i++){
for (int j=1;j<=N;j++){
dis[i][j]=map[i][j];
}
}
for (int k=1;k<=N;k++){
for (int i=1;i<=N;i++){
for (int j=1;j<=N;j++){
if (dis[i][j]>dis[i][k]+dis[k][j])//在点 i 和 j 之间插入点 k 取之前从i到j的距离 和 插入点k后经过k点 的i到j的距离 小的那个
{
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
}
int main (){
int n,m,t;
while (scanf ("%d%d",&N,&M)&&(N||M)){
for (int i=1;i<=N;i++){
for (int j=1;j<=N;j++){
if (i!=j)
map[i][j]=maxinf;
else
map[i][j]=0;//本身到本身为 0
}
}
while (M--){
scanf ("%d%d%d",&n,&m,&t);
//两点之间赋距离
map[n][m]=t;
map[m][n]=t;
}
floyd();
printf ("%d\n",dis[1][N]);
}
return 0;
}