【例4-3】、最短路径问题(Dijkstra)
题目参见“Floyed算法”,但本题要求使用dijkstra算法解决。
1342:【例4-1】最短路径问题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[101][3];
double c[101];
bool b[101];
double f[101][101];
int n,i,j,k,x,y,m,s,e;
double minl;
double maxx = 1e30;
int main()
{
cin >> n;
//第2行到第n+1行(共n行) ,每行两个整数x和y,描述了一个点的坐标
for (i = 1; i <= n; i++)
cin >> a[i][1] >> a[i][2];
//f数组初始化最大值
for (i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
f[i][j] = maxx;
//m条边
cin >> m;
//预处理x.y间距离f[x][y]
for (i = 1; i <= m; i++)
{
//此后的m 行,每行描述一条连线,由两个整数i和j组成,
//表示第i个点和第j个点之间有连线。
cin >> x >> y;
f[x][y] = f[y][x] = sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
}
//最后一行:两个整数s和t,分别表示源点和目标点。
cin >> s >> e;
for (i = 1; i <= n; i++)
c[i] = f[s][i];
//dijkstra 最短路
memset(b,false,sizeof(b));
b[s] = true;
c[s] = 0;
for (i = 1;i<= n-1;i++)
{
minl = maxx; //赋为极大值
k = 0;
//查找可以更新的点
//找到离s顶点最近的顶点
for (j = 1; j <= n; j++)
{
if ( ( ! b[j] ) && ( c[j] < minl ) )
{
minl = c[j];
k = j;
}
}
if (k == 0) break;
//标记为白点
b[k] = true;
for (j = 1; j <= n; j++)
if (c[k] + f[k][j] < c[j])
c[j] = c[k] + f[k][j];
}
printf("%.2lf\n",c[e]);
return 0;
}
Dijkstra算法证明图解
路径规划Dijkstra算法——超详细原理图解
Dijkstra 算法 图文详解
Dijkstra算法图文详解
《啊哈算法》第6章 最短路径
算法8:巧妙的邻接表(数组实现)
第1节 只有五行的算法--Floyd-Warshall
【啊哈!算法】算法6:只有五行的Floyd最短路算法
第2节 Dijkstra算法--通过边实现松弛
【啊哈!算法】系列7:Dijkstra最短路算法
第3节 Bellman-Ford--解决负权边
第4节 Bellman-Ford的队列优化
第5节 最短路径算法对比分析
四种最短路径算法对比
#include <stdio.h>
int main()
{
freopen("x.in","r",stdin);
freopen("y.out","w",stdout);
int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;
int inf=99999999;
scanf("%d %d",&n,&m);
//初始化
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if( i==j ) e[i][j]=0;
else
{
e[i][j]=inf;
//极大值,表示不连通
}
}
//输入m条边
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
//t1-->t2 权值为t3 注意有方向
}
dis[1]=0;
for(i=1;i<=n;i++)
{
dis[i]=e[1][i];
}
for(i=1;i<=n;i++)
{
book[i]=0;
}
book[1]=1;
/*
4 5
1 4 9
2 4 6
1 2 5
4 3 8
1 3 7
*/
for(i=1;i<=n-1;i++)
{
//极小值初始值为非常大的值 min=inf;
for(j=1;j<=n;j++)
{
if(book[j]==0 && dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++)
{
//u-->v是连通的
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
{
dis[v]=dis[u]+e[u][v];
}
}
}
}
for(i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
getchar();
getchar();
fclose(stdin);
fclose(stdout);
return 0;
}
/*
1-1-6
1-2-6
1-3-6
1-4-6
1-5-6
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 2 1
1 2 2
1 2 3
1 2 4
1 2 5
1 2 6
1 3 1
1 3 2
1 3 3
1 3 4
1 3 5
1 3 6
1 4 1
1 4 2
1 4 3
1 4 4
1 4 5
1 4 6
1 5 1
1 5 2
1 5 3
1 5 4
1 5 5
1 5 6
1 6 1
1 6 2
1 6 3
1 6 4
1 6 5
1 6 6
*/
《啊哈算法》相关链接收集
啊哈算法系列(C语言、python、Java )
啊哈算法(python)
啊哈算法精华版