1.算法描述
lowcost[i]记录源点到点i的最短距离,visit[i]表示点i已被访问过,Un表示未访问节点的集合, Vi表示已访问节点的集合。
(1)寻找具有最小lowcost值的节点j
(2)将(1)中节点j标记已访问,visit[ j ]=1,并更新lowcost数组
(3)直至访问完所有节点,即Un为空。
在源代码中,min_node表示节点j,min_lowcost表示最小lowcost。
2. 问题
2.1 POJ 2387
注意:有重边(即一条边可能有多次输入),边的长度不是题目中1~100。
memset(,inf,)函数不能这样用。
源代码:
2387 |
Accepted |
4084K |
79MS |
C |
1269B |
2013-07-15 10:35:52 |
#include "stdio.h"
#include "stdlib.h"
#define MAX 1000
#define inf 0xffffff
int dis[MAX][MAX];
void init(int T,int N)
{
int i,j,from,to,len;
for(i=0;i<N;i++)
{
for(j=0;j<i;j++)
dis[i][j]=dis[j][i]=inf;
dis[i][i]=0;
}
for(i=1;i<=T;i++)
{
scanf("%d%d%d",&from,&to,&len);
if(len<dis[from-1][to-1])
dis[from-1][to-1]=dis[to-1][from-1]=len;
}
}
int smaller(int be,int af)
{
return be<=af?be:af;
}
void dijkstra(int N)
{
int i,count=1,min_lowcost,min_node;
int *lowcost=(int *) malloc(N*sizeof(int));
int *visit=(int *) malloc(N*sizeof(int));
for(i=0;i<N;i++)
{
lowcost[i]=inf;
visit[i]=0;
}
lowcost[N-1]=0;
visit[N-1]=1;
min_node=N-1;
while(count<=N)
{
min_lowcost=inf;
for(i=0;i<N-1;i++)
{
if(!visit[i]&&dis[min_node][i]!=inf)
lowcost[i]=smaller(lowcost[i],lowcost[min_node]+dis[min_node][i]);
}
for(i=0;i<N-1;i++)
if(!visit[i]&&lowcost[i]<min_lowcost)
{
min_lowcost=lowcost[i];
min_node=i;
}
visit[min_node]=1;
count++;
}
printf("%d\n",lowcost[0]);
free(lowcost);
free(visit);
}
int main()
{
int T,N;
scanf("%d%d",&T,&N);
init(T,N);
dijkstra(N);
return 0;
}
2.2 POJ 2253
源点是Freddy's stone,汇点是Fiona's stone。源点到汇点的每一通路均有一条最长边,在这些最长边中找出最小值,最小值即为Frog Distance。
Dijkstra算法求解(源点到图中其他点)所有通路中的最短路径,其松弛条件:
为求解最小最长边,将松弛条件修改为
其中,dis[i]记录源点到点i所有通路的最长边。
源代码:
2253 |
Accepted |
504K |
16MS |
C |
1673B |
2013-07-16 09:40:43 |
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define MAX 200
#define inf 0xffff
double edge[MAX][MAX];
typedef struct
{
int x,y;
}Tpoint;
Tpoint point[MAX];
double distance(Tpoint p1,Tpoint p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
void init(int n)
{
int i,j;
for(i=0;i<n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
edge[i][j]=edge[j][i]=distance(point[i],point[j]);
edge[i][i]=0;
}
}
double smaller(double be,double af)
{
return be<=af?be:af;
}
double larger(double be,double af)
{
return be>=af?be:af;
}
void dijkstra(int n)
{
int i,count=1,min_node;
double min_dis;
double *dis=(double *) malloc(n*sizeof(double));
int *visit=(int *) malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
dis[i]=inf;
visit[i]=0;
}
dis[0]=0;
visit[0]=1;
min_node=0;
while(count<=n)
{
min_dis=inf;
for(i=1;i<n;i++)
{
if(!visit[i])
dis[i]=smaller(larger(dis[min_node],edge[min_node][i]),dis[i]);
}
for(i=1;i<n;i++)
if(!visit[i]&&dis[i]<min_dis)
{
min_dis=dis[i];
min_node=i;
}
visit[min_node]=1;
count++;
}
printf("%.3f\n\n",dis[1]);
free(dis);
free(visit);
}
int main()
{
int n,coun=1;
while(scanf("%d",&n)&&n!=0)
{
init(n);
printf("Scenario #%d\n",coun);
printf("Frog Distance = ");
dijkstra(n);
coun++;
}
return 0;
}
2.3 POJ 1502
源代码:
1502 |
Accepted |
408K |
0MS |
GCC |
1491B |
2013-08-08 20:16:00 |
#include "stdio.h"
#include "stdlib.h"
#define MAX 100
#define inf 0xffff
int edge[MAX][MAX];
void init(int N)
{
int i,j,m;
for(i=1;i<N;i++)
{
for(j=0;j<i;j++)
{
if(scanf("%d",&m)!=0)
edge[i][j]=edge[j][i]=m;
else
{
edge[i][j]=edge[j][i]=inf;
scanf("x");
}
}
edge[i][i]=0;
}
}
int smaller(int be,int af)
{
return be<=af?be:af;
}
void dijkstra(int N)
{
int i,count=1,min_lowcost,min_node;
int *lowcost=(int *) malloc(N*sizeof(int));
int *visit=(int *) malloc(N*sizeof(int));
for(i=0;i<N;i++)
{
lowcost[i]=inf;
visit[i]=0;
}
lowcost[N-1]=0;
visit[N-1]=1;
min_node=N-1;
while(count<N)
{
min_lowcost=inf;
for(i=0;i<N-1;i++)
{
if(!visit[i]&&edge[min_node][i]!=inf)
lowcost[i]=smaller(lowcost[i],lowcost[min_node]+edge[min_node][i]);
}
for(i=0;i<N-1;i++)
if(!visit[i]&&lowcost[i]<min_lowcost)
{
min_lowcost=lowcost[i];
min_node=i;
}
visit[min_node]=1;
count++;
}
printf("%d\n",min_lowcost);
free(lowcost);
free(visit);
}
int main()
{
int N;
scanf("%d",&N);
init(N);
dijkstra(N);
return 0;
}
分享到:
相关推荐
最短路径算法dijkstra的matlab实现
最短路径算法Dijkstra源代码,测试可以正常使用
java算法分析与设计之单源最短路径(Dijkstra算法)源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络...
Dijkstra算法求最短路径的C/C++程序
最短路径分析Dijkstra算法的优化实现,徐辛超,,最短路径问题是地理信息系统的关键问题,传统Dijkstra算法在求解节点间最短路径时,对已标识节点以外的大量节点进行了计算,从而影�
并行最短路径算法Dijkstra。 为实现并行最短路径计算,我们必须要解决如下问题: (1)数据获取:利用随机函数生成大约2000个节点及其节点之间的距离。本程序使用邻接矩阵来存储带权有向图的信息。矩阵大小2000*2000...
详细讲述如何实现最短路径,及c#的代码实现
最短路径-Dijkstra算法 从指定起始点向任一点搜索基于一定权重的最短路径。
最短路径算法dijkstra的matlab程序。
利用Matlab编写的求解最短路径的Dijkstra算法,测试通过
该程序是我写的博客“一起talk C栗子吧(第五十四回:C语言实例--图的最短路径二)”的配套程序,共享给大家使用
dijkstra第k条最短路径算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。
本设计以VC++6.0作为程序开发环境,C语言作为程序开发语言,详细介绍了最短路径的求解算法及其C语言实现过程。系统主要实现了图的创建、单源点最短路径的计算功能。依照本系统可以解决实际生活中许多路径选择问题,...
Dijkstra最短路径算法的Matlab实现 包括最短路径的打印子程序
毕业设计:最短路径算法实现,Dijkstra算法,双向Dijkstra算法,CH算法,SILC算法 毕业设计:最短路径算法实现,Dijkstra算法,双向Dijkstra算法,CH算法,SILC算法 毕业设计:最短路径算法实现,Dijkstra算法,双向...
C# 最短路径:Dijkstra算法,参考java代码写的,重要的是理解算法思想
Dijkstra算法找最短路径代码,包括43个案例分析
针对用于网络寻径表刷新的0sPF路由选择协议中使用的计算最短路径树的Diikstra算法在网络应用中的不足.提出了一种改进算法,用以计算边和节点上都有代价的图的最短路径树,以更全面刻画网络状态,找到更合理的最短...
最短路径用Dijkstra算法实现的MFC编程 ,用画笔将点连接起来
最短路径查找Dijkstra算法