Dijkstra和prim 算法的区别(PKU2253frogger解题报告)

这两个算法长的十分相像,所以模板都差不多。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值