这两个算法长的十分相像,所以模板都差不多。
D算法是用于求最短路径,通弗洛伊德算法,prim算法是用于求最小生成树的,同kruskal算法。
两个的模板都是先用数组origin存放原始数据,max_distance存放矩阵中的最大值,
result存放最小生成树(或最短路径)的最大边,opt存放节点和最小生成树之间的最小距
离, flag判断是否已经加入到最小生成树(或最短路径)中,首先将1号顶点加入最小生成树
中,flag[1]为true,其他为false,opt[i]的值为origin[1][i]的值,然后选
择不在最小生成树(最短路径)中的最小边i,然后加入到最小生成树(最短路径)中,另外更新
opt[i],flag[i]。如此反复,直到取到v-1条边为止(或直到到达终点为止)。
:
for(i=0;i<n;i++)
{
scanf("%d %d",&X[i],&Y[i]);
flag[i]=0; //所有节点都还没有到达
distance[i]=point_distance(0,i); //初始化distance[]
}
//第0个节点,即起点加入到已经到达的集合中
flag[0]=1;
max_step=0;
//循环直到终点出现在可到达的距离中
while(1)
{
min_distance=1500;
for(j=1;j<=n;j++)
{
//找到最小距离加入到集合中
if(!flag[j]&&distance[j]<min_distance)
{
vertex=j;
min_distance=distance[j];
}
}
//保存最大跳距离
if(max_step<min_distance)
max_step=min_distance;
//如果是终点
if(vertex==1)
break;
flag[vertex]=1;
//更新最小距离
for(i=1;i<=n;i++)
{
distance[i]=distance[i]<point_distance(i,vertex)?distance[i]:point_distance(i,vertex);
}
}
两种算法会出现所求出的树不同,这种情况就是算法执行过程中遇到边相等的情况,而且相等的边正好可以成环。比如A--B 8:A----C 8:B----C 2;用D算法求出的就是A---C,A----B;用Prim算法就是A--B---C;因为PRIM重的是某一个原点与其他任何一个点的连接权值最小,而DIJKSTRA是选择与距源点的路迳权值最小的点
PKU2253AC代码:
#include <math.h>
#include <stdio.h>
int X[201],Y[201];
//求两个点之间的距离
double point_distance(int i,int j)
{
return sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));
}
int main()
{
int n,i,j,vertex,count=1;
//distance[i]表示i到已经到达的点的最小距离
double max_step,distance[201],min_distance;
//flag[i]存放第i个节点是否已经到达
int flag[201];
while(scanf("%d",&n),n!=0)
{
for(i=0;i<n;i++)
{
scanf("%d %d",&X[i],&Y[i]);
flag[i]=0; //所有节点都还没有到达
distance[i]=point_distance(0,i); //初始化distance[]
}
//第0个节点,即起点加入到已经到达的集合中
flag[0]=1;
max_step=0;
//循环直到终点出现在可到达的距离中
while(1)
{
min_distance=1500;
for(j=1;j<=n;j++)
{
//找到最小距离加入到集合中
if(!flag[j]&&distance[j]<min_distance)
{
vertex=j;
min_distance=distance[j];
}
}
//保存最大跳距离
if(max_step<min_distance)
max_step=min_distance;
//如果是终点
if(vertex==1)
break;
flag[vertex]=1;
//更新最小距离
for(i=1;i<=n;i++)
{
distance[i]=distance[i]<point_distance(i,vertex)?distance[i]:point_distance(i,vertex);
}
}
printf("Scenario #%d/nFrog Distance = %.3lf/n/n",count++,max_step);
}
return 1;
}